From: Documentation Bot Date: Fri, 28 Jun 2024 13:43:59 +0000 (+0000) Subject: docs: generate documentation X-Git-Url: https://git.piment-noir.org/?a=commitdiff_plain;h=224d008191f52fa20b93e1ba67919569f8d6e315;p=poolifier.git docs: generate documentation --- diff --git a/docs/assets/highlight.css b/docs/assets/highlight.css index 1c01c0c1..0b3cf03b 100644 --- a/docs/assets/highlight.css +++ b/docs/assets/highlight.css @@ -1,8 +1,8 @@ :root { - --light-hl-0: #0000FF; - --dark-hl-0: #569CD6; - --light-hl-1: #001080; - --dark-hl-1: #9CDCFE; + --light-hl-0: #001080; + --dark-hl-0: #9CDCFE; + --light-hl-1: #0000FF; + --dark-hl-1: #569CD6; --light-hl-2: #000000; --dark-hl-2: #D4D4D4; --light-hl-3: #0070C1; diff --git a/docs/assets/icons.js b/docs/assets/icons.js index b79c9e89..e88e8ca7 100644 --- a/docs/assets/icons.js +++ b/docs/assets/icons.js @@ -1,15 +1,18 @@ -(function(svg) { - svg.innerHTML = ``; - svg.style.display = 'none'; - if (location.protocol === 'file:') { - if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', updateUseElements); - else updateUseElements() - function updateUseElements() { - document.querySelectorAll('use').forEach(el => { - if (el.getAttribute('href').includes('#icon-')) { - el.setAttribute('href', el.getAttribute('href').replace(/.*#/, '#')); - } - }); - } +(function() { + addIcons(); + function addIcons() { + if (document.readyState === "loading") return document.addEventListener("DOMContentLoaded", addIcons); + const svg = document.body.appendChild(document.createElementNS("http://www.w3.org/2000/svg", "svg")); + svg.innerHTML = `""`; + svg.style.display = "none"; + if (location.protocol === "file:") updateUseElements(); } -})(document.body.appendChild(document.createElementNS('http://www.w3.org/2000/svg', 'svg'))) \ No newline at end of file + + function updateUseElements() { + document.querySelectorAll("use").forEach(el => { + if (el.getAttribute("href").includes("#icon-")) { + el.setAttribute("href", el.getAttribute("href").replace(/.*#/, "#")); + } + }); + } +})() \ No newline at end of file diff --git a/docs/assets/icons.svg b/docs/assets/icons.svg index 7dead611..e371b8b5 100644 --- a/docs/assets/icons.svg +++ b/docs/assets/icons.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/docs/assets/main.js b/docs/assets/main.js index d6f13886..7d7f77a0 100644 --- a/docs/assets/main.js +++ b/docs/assets/main.js @@ -1,8 +1,9 @@ "use strict"; -"use strict";(()=>{var Ce=Object.create;var ne=Object.defineProperty;var Pe=Object.getOwnPropertyDescriptor;var Oe=Object.getOwnPropertyNames;var _e=Object.getPrototypeOf,Re=Object.prototype.hasOwnProperty;var Me=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var Fe=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Oe(e))!Re.call(t,i)&&i!==n&&ne(t,i,{get:()=>e[i],enumerable:!(r=Pe(e,i))||r.enumerable});return t};var De=(t,e,n)=>(n=t!=null?Ce(_e(t)):{},Fe(e||!t||!t.__esModule?ne(n,"default",{value:t,enumerable:!0}):n,t));var ae=Me((se,oe)=>{(function(){var t=function(e){var n=new t.Builder;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),n.searchPipeline.add(t.stemmer),e.call(n,n),n.build()};t.version="2.3.9";t.utils={},t.utils.warn=function(e){return function(n){e.console&&console.warn&&console.warn(n)}}(this),t.utils.asString=function(e){return e==null?"":e.toString()},t.utils.clone=function(e){if(e==null)return e;for(var n=Object.create(null),r=Object.keys(e),i=0;i0){var d=t.utils.clone(n)||{};d.position=[a,u],d.index=s.length,s.push(new t.Token(r.slice(a,o),d))}a=o+1}}return s},t.tokenizer.separator=/[\s\-]+/;t.Pipeline=function(){this._stack=[]},t.Pipeline.registeredFunctions=Object.create(null),t.Pipeline.registerFunction=function(e,n){n in this.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[e.label]=e},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn(`Function is not registered with pipeline. This may cause problems when serialising the index. -`,e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(r){var i=t.Pipeline.registeredFunctions[r];if(i)n.add(i);else throw new Error("Cannot load unregistered function: "+r)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(n){t.Pipeline.warnIfFunctionNotRegistered(n),this._stack.push(n)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");r=r+1,this._stack.splice(r,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");this._stack.splice(r,0,n)},t.Pipeline.prototype.remove=function(e){var n=this._stack.indexOf(e);n!=-1&&this._stack.splice(n,1)},t.Pipeline.prototype.run=function(e){for(var n=this._stack.length,r=0;r1&&(oe&&(r=s),o!=e);)i=r-n,s=n+Math.floor(i/2),o=this.elements[s*2];if(o==e||o>e)return s*2;if(ol?d+=2:a==l&&(n+=r[u+1]*i[d+1],u+=2,d+=2);return n},t.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},t.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),n=1,r=0;n0){var o=s.str.charAt(0),a;o in s.node.edges?a=s.node.edges[o]:(a=new t.TokenSet,s.node.edges[o]=a),s.str.length==1&&(a.final=!0),i.push({node:a,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(s.editsRemaining!=0){if("*"in s.node.edges)var l=s.node.edges["*"];else{var l=new t.TokenSet;s.node.edges["*"]=l}if(s.str.length==0&&(l.final=!0),i.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&i.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),s.str.length==1&&(s.node.final=!0),s.str.length>=1){if("*"in s.node.edges)var u=s.node.edges["*"];else{var u=new t.TokenSet;s.node.edges["*"]=u}s.str.length==1&&(u.final=!0),i.push({node:u,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var d=s.str.charAt(0),y=s.str.charAt(1),p;y in s.node.edges?p=s.node.edges[y]:(p=new t.TokenSet,s.node.edges[y]=p),s.str.length==1&&(p.final=!0),i.push({node:p,editsRemaining:s.editsRemaining-1,str:d+s.str.slice(2)})}}}return r},t.TokenSet.fromString=function(e){for(var n=new t.TokenSet,r=n,i=0,s=e.length;i=e;n--){var r=this.uncheckedNodes[n],i=r.child.toString();i in this.minimizedNodes?r.parent.edges[r.char]=this.minimizedNodes[i]:(r.child._str=i,this.minimizedNodes[i]=r.child),this.uncheckedNodes.pop()}};t.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},t.Index.prototype.search=function(e){return this.query(function(n){var r=new t.QueryParser(e,n);r.parse()})},t.Index.prototype.query=function(e){for(var n=new t.Query(this.fields),r=Object.create(null),i=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),l=0;l1?this._b=1:this._b=e},t.Builder.prototype.k1=function(e){this._k1=e},t.Builder.prototype.add=function(e,n){var r=e[this._ref],i=Object.keys(this._fields);this._documents[r]=n||{},this.documentCount+=1;for(var s=0;s=this.length)return t.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},t.QueryLexer.prototype.width=function(){return this.pos-this.start},t.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},t.QueryLexer.prototype.backup=function(){this.pos-=1},t.QueryLexer.prototype.acceptDigitRun=function(){var e,n;do e=this.next(),n=e.charCodeAt(0);while(n>47&&n<58);e!=t.QueryLexer.EOS&&this.backup()},t.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(t.QueryLexer.TERM)),e.ignore(),e.more())return t.QueryLexer.lexText},t.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.EDIT_DISTANCE),t.QueryLexer.lexText},t.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.BOOST),t.QueryLexer.lexText},t.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(t.QueryLexer.TERM)},t.QueryLexer.termSeparator=t.tokenizer.separator,t.QueryLexer.lexText=function(e){for(;;){var n=e.next();if(n==t.QueryLexer.EOS)return t.QueryLexer.lexEOS;if(n.charCodeAt(0)==92){e.escapeCharacter();continue}if(n==":")return t.QueryLexer.lexField;if(n=="~")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexEditDistance;if(n=="^")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexBoost;if(n=="+"&&e.width()===1||n=="-"&&e.width()===1)return e.emit(t.QueryLexer.PRESENCE),t.QueryLexer.lexText;if(n.match(t.QueryLexer.termSeparator))return t.QueryLexer.lexTerm}},t.QueryParser=function(e,n){this.lexer=new t.QueryLexer(e),this.query=n,this.currentClause={},this.lexemeIdx=0},t.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=t.QueryParser.parseClause;e;)e=e(this);return this.query},t.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},t.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},t.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},t.QueryParser.parseClause=function(e){var n=e.peekLexeme();if(n!=null)switch(n.type){case t.QueryLexer.PRESENCE:return t.QueryParser.parsePresence;case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expected either a field or a term, found "+n.type;throw n.str.length>=1&&(r+=" with value '"+n.str+"'"),new t.QueryParseError(r,n.start,n.end)}},t.QueryParser.parsePresence=function(e){var n=e.consumeLexeme();if(n!=null){switch(n.str){case"-":e.currentClause.presence=t.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=t.Query.presence.REQUIRED;break;default:var r="unrecognised presence operator'"+n.str+"'";throw new t.QueryParseError(r,n.start,n.end)}var i=e.peekLexeme();if(i==null){var r="expecting term or field, found nothing";throw new t.QueryParseError(r,n.start,n.end)}switch(i.type){case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expecting term or field, found '"+i.type+"'";throw new t.QueryParseError(r,i.start,i.end)}}},t.QueryParser.parseField=function(e){var n=e.consumeLexeme();if(n!=null){if(e.query.allFields.indexOf(n.str)==-1){var r=e.query.allFields.map(function(o){return"'"+o+"'"}).join(", "),i="unrecognised field '"+n.str+"', possible fields: "+r;throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.fields=[n.str];var s=e.peekLexeme();if(s==null){var i="expecting term, found nothing";throw new t.QueryParseError(i,n.start,n.end)}switch(s.type){case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var i="expecting term, found '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseTerm=function(e){var n=e.consumeLexeme();if(n!=null){e.currentClause.term=n.str.toLowerCase(),n.str.indexOf("*")!=-1&&(e.currentClause.usePipeline=!1);var r=e.peekLexeme();if(r==null){e.nextClause();return}switch(r.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+r.type+"'";throw new t.QueryParseError(i,r.start,r.end)}}},t.QueryParser.parseEditDistance=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="edit distance must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.editDistance=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseBoost=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="boost must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.boost=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},function(e,n){typeof define=="function"&&define.amd?define(n):typeof se=="object"?oe.exports=n():e.lunr=n()}(this,function(){return t})})()});var re=[];function G(t,e){re.push({selector:e,constructor:t})}var U=class{constructor(){this.alwaysVisibleMember=null;this.createComponents(document.body),this.ensureFocusedElementVisible(),this.listenForCodeCopies(),window.addEventListener("hashchange",()=>this.ensureFocusedElementVisible()),document.body.style.display||(this.ensureFocusedElementVisible(),this.updateIndexVisibility(),this.scrollToHash())}createComponents(e){re.forEach(n=>{e.querySelectorAll(n.selector).forEach(r=>{r.dataset.hasInstance||(new n.constructor({el:r,app:this}),r.dataset.hasInstance=String(!0))})})}filterChanged(){this.ensureFocusedElementVisible()}showPage(){document.body.style.display&&(console.log("Show page"),document.body.style.removeProperty("display"),this.ensureFocusedElementVisible(),this.updateIndexVisibility(),this.scrollToHash())}scrollToHash(){if(location.hash){console.log("Scorlling");let e=document.getElementById(location.hash.substring(1));if(!e)return;e.scrollIntoView({behavior:"instant",block:"start"})}}ensureActivePageVisible(){let e=document.querySelector(".tsd-navigation .current"),n=e?.parentElement;for(;n&&!n.classList.contains(".tsd-navigation");)n instanceof HTMLDetailsElement&&(n.open=!0),n=n.parentElement;if(e&&!e.checkVisibility()){let r=e.getBoundingClientRect().top-document.documentElement.clientHeight/4;document.querySelector(".site-menu").scrollTop=r}}updateIndexVisibility(){let e=document.querySelector(".tsd-index-content"),n=e?.open;e&&(e.open=!0),document.querySelectorAll(".tsd-index-section").forEach(r=>{r.style.display="block";let i=Array.from(r.querySelectorAll(".tsd-index-link")).every(s=>s.offsetParent==null);r.style.display=i?"none":"block"}),e&&(e.open=n)}ensureFocusedElementVisible(){if(this.alwaysVisibleMember&&(this.alwaysVisibleMember.classList.remove("always-visible"),this.alwaysVisibleMember.firstElementChild.remove(),this.alwaysVisibleMember=null),!location.hash)return;let e=document.getElementById(location.hash.substring(1));if(!e)return;let n=e.parentElement;for(;n&&n.tagName!=="SECTION";)n=n.parentElement;if(n&&n.offsetParent==null){this.alwaysVisibleMember=n,n.classList.add("always-visible");let r=document.createElement("p");r.classList.add("warning"),r.textContent="This member is normally hidden due to your filter settings.",n.prepend(r)}}listenForCodeCopies(){document.querySelectorAll("pre > button").forEach(e=>{let n;e.addEventListener("click",()=>{e.previousElementSibling instanceof HTMLElement&&navigator.clipboard.writeText(e.previousElementSibling.innerText.trim()),e.textContent="Copied!",e.classList.add("visible"),clearTimeout(n),n=setTimeout(()=>{e.classList.remove("visible"),n=setTimeout(()=>{e.textContent="Copy"},100)},1e3)})})}};var ie=(t,e=100)=>{let n;return()=>{clearTimeout(n),n=setTimeout(()=>t(),e)}};var de=De(ae());async function le(t,e){if(!window.searchData)return;let n=await fetch(window.searchData),r=new Blob([await n.arrayBuffer()]).stream().pipeThrough(new DecompressionStream("gzip")),i=await new Response(r).json();t.data=i,t.index=de.Index.load(i.index),e.classList.remove("loading"),e.classList.add("ready")}function he(){let t=document.getElementById("tsd-search");if(!t)return;let e={base:t.dataset.base+"/"},n=document.getElementById("tsd-search-script");t.classList.add("loading"),n&&(n.addEventListener("error",()=>{t.classList.remove("loading"),t.classList.add("failure")}),n.addEventListener("load",()=>{le(e,t)}),le(e,t));let r=document.querySelector("#tsd-search input"),i=document.querySelector("#tsd-search .results");if(!r||!i)throw new Error("The input field or the result list wrapper was not found");let s=!1;i.addEventListener("mousedown",()=>s=!0),i.addEventListener("mouseup",()=>{s=!1,t.classList.remove("has-focus")}),r.addEventListener("focus",()=>t.classList.add("has-focus")),r.addEventListener("blur",()=>{s||(s=!1,t.classList.remove("has-focus"))}),Ae(t,i,r,e)}function Ae(t,e,n,r){n.addEventListener("input",ie(()=>{Ve(t,e,n,r)},200));let i=!1;n.addEventListener("keydown",s=>{i=!0,s.key=="Enter"?Ne(e,n):s.key=="Escape"?n.blur():s.key=="ArrowUp"?ue(e,-1):s.key==="ArrowDown"?ue(e,1):i=!1}),n.addEventListener("keypress",s=>{i&&s.preventDefault()}),document.body.addEventListener("keydown",s=>{s.altKey||s.ctrlKey||s.metaKey||!n.matches(":focus")&&s.key==="/"&&(n.focus(),s.preventDefault())})}function Ve(t,e,n,r){if(!r.index||!r.data)return;e.textContent="";let i=n.value.trim(),s;if(i){let o=i.split(" ").map(a=>a.length?`*${a}*`:"").join(" ");s=r.index.search(o)}else s=[];for(let o=0;oa.score-o.score);for(let o=0,a=Math.min(10,s.length);o`,d=ce(l.name,i);globalThis.DEBUG_SEARCH_WEIGHTS&&(d+=` (score: ${s[o].score.toFixed(2)})`),l.parent&&(d=` - ${ce(l.parent,i)}.${d}`);let y=document.createElement("li");y.classList.value=l.classes??"";let p=document.createElement("a");p.href=r.base+l.url,p.innerHTML=u+d,y.append(p),e.appendChild(y)}}function ue(t,e){let n=t.querySelector(".current");if(!n)n=t.querySelector(e==1?"li:first-child":"li:last-child"),n&&n.classList.add("current");else{let r=n;if(e===1)do r=r.nextElementSibling??void 0;while(r instanceof HTMLElement&&r.offsetParent==null);else do r=r.previousElementSibling??void 0;while(r instanceof HTMLElement&&r.offsetParent==null);r&&(n.classList.remove("current"),r.classList.add("current"))}}function Ne(t,e){let n=t.querySelector(".current");if(n||(n=t.querySelector("li:first-child")),n){let r=n.querySelector("a");r&&(window.location.href=r.href),e.blur()}}function ce(t,e){if(e==="")return t;let n=t.toLocaleLowerCase(),r=e.toLocaleLowerCase(),i=[],s=0,o=n.indexOf(r);for(;o!=-1;)i.push(K(t.substring(s,o)),`${K(t.substring(o,o+r.length))}`),s=o+r.length,o=n.indexOf(r,s);return i.push(K(t.substring(s))),i.join("")}var He={"&":"&","<":"<",">":">","'":"'",'"':"""};function K(t){return t.replace(/[&<>"'"]/g,e=>He[e])}var I=class{constructor(e){this.el=e.el,this.app=e.app}};var F="mousedown",fe="mousemove",H="mouseup",J={x:0,y:0},pe=!1,ee=!1,Be=!1,D=!1,me=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);document.documentElement.classList.add(me?"is-mobile":"not-mobile");me&&"ontouchstart"in document.documentElement&&(Be=!0,F="touchstart",fe="touchmove",H="touchend");document.addEventListener(F,t=>{ee=!0,D=!1;let e=F=="touchstart"?t.targetTouches[0]:t;J.y=e.pageY||0,J.x=e.pageX||0});document.addEventListener(fe,t=>{if(ee&&!D){let e=F=="touchstart"?t.targetTouches[0]:t,n=J.x-(e.pageX||0),r=J.y-(e.pageY||0);D=Math.sqrt(n*n+r*r)>10}});document.addEventListener(H,()=>{ee=!1});document.addEventListener("click",t=>{pe&&(t.preventDefault(),t.stopImmediatePropagation(),pe=!1)});var X=class extends I{constructor(e){super(e),this.className=this.el.dataset.toggle||"",this.el.addEventListener(H,n=>this.onPointerUp(n)),this.el.addEventListener("click",n=>n.preventDefault()),document.addEventListener(F,n=>this.onDocumentPointerDown(n)),document.addEventListener(H,n=>this.onDocumentPointerUp(n))}setActive(e){if(this.active==e)return;this.active=e,document.documentElement.classList.toggle("has-"+this.className,e),this.el.classList.toggle("active",e);let n=(this.active?"to-has-":"from-has-")+this.className;document.documentElement.classList.add(n),setTimeout(()=>document.documentElement.classList.remove(n),500)}onPointerUp(e){D||(this.setActive(!0),e.preventDefault())}onDocumentPointerDown(e){if(this.active){if(e.target.closest(".col-sidebar, .tsd-filter-group"))return;this.setActive(!1)}}onDocumentPointerUp(e){if(!D&&this.active&&e.target.closest(".col-sidebar")){let n=e.target.closest("a");if(n){let r=window.location.href;r.indexOf("#")!=-1&&(r=r.substring(0,r.indexOf("#"))),n.href.substring(0,r.length)==r&&setTimeout(()=>this.setActive(!1),250)}}}};var te;try{te=localStorage}catch{te={getItem(){return null},setItem(){}}}var Q=te;var ye=document.head.appendChild(document.createElement("style"));ye.dataset.for="filters";var Y=class extends I{constructor(e){super(e),this.key=`filter-${this.el.name}`,this.value=this.el.checked,this.el.addEventListener("change",()=>{this.setLocalStorage(this.el.checked)}),this.setLocalStorage(this.fromLocalStorage()),ye.innerHTML+=`html:not(.${this.key}) .tsd-is-${this.el.name} { display: none; } -`,this.app.updateIndexVisibility()}fromLocalStorage(){let e=Q.getItem(this.key);return e?e==="true":this.el.checked}setLocalStorage(e){Q.setItem(this.key,e.toString()),this.value=e,this.handleValueChange()}handleValueChange(){this.el.checked=this.value,document.documentElement.classList.toggle(this.key,this.value),this.app.filterChanged(),this.app.updateIndexVisibility()}};var Z=class extends I{constructor(e){super(e),this.summary=this.el.querySelector(".tsd-accordion-summary"),this.icon=this.summary.querySelector("svg"),this.key=`tsd-accordion-${this.summary.dataset.key??this.summary.textContent.trim().replace(/\s+/g,"-").toLowerCase()}`;let n=Q.getItem(this.key);this.el.open=n?n==="true":this.el.open,this.el.addEventListener("toggle",()=>this.update());let r=this.summary.querySelector("a");r&&r.addEventListener("click",()=>{location.assign(r.href)}),this.update()}update(){this.icon.style.transform=`rotate(${this.el.open?0:-90}deg)`,Q.setItem(this.key,this.el.open.toString())}};function ge(t){let e=Q.getItem("tsd-theme")||"os";t.value=e,ve(e),t.addEventListener("change",()=>{Q.setItem("tsd-theme",t.value),ve(t.value)})}function ve(t){document.documentElement.dataset.theme=t}var Le;function be(){let t=document.getElementById("tsd-nav-script");t&&(t.addEventListener("load",xe),xe())}async function xe(){let t=document.getElementById("tsd-nav-container");if(!t||!window.navigationData)return;let n=await(await fetch(window.navigationData)).arrayBuffer(),r=new Blob([n]).stream().pipeThrough(new DecompressionStream("gzip")),i=await new Response(r).json();Le=t.dataset.base+"/",t.innerHTML="";for(let s of i)we(s,t,[]);window.app.createComponents(t),window.app.showPage(),window.app.ensureActivePageVisible()}function we(t,e,n){let r=e.appendChild(document.createElement("li"));if(t.children){let i=[...n,t.text],s=r.appendChild(document.createElement("details"));s.className=t.class?`${t.class} tsd-index-accordion`:"tsd-index-accordion",s.dataset.key=i.join("$");let o=s.appendChild(document.createElement("summary"));o.className="tsd-accordion-summary",o.innerHTML='',Ee(t,o);let a=s.appendChild(document.createElement("div"));a.className="tsd-accordion-details";let l=a.appendChild(document.createElement("ul"));l.className="tsd-nested-navigation";for(let u of t.children)we(u,l,i)}else Ee(t,r,t.class)}function Ee(t,e,n){if(t.path){let r=e.appendChild(document.createElement("a"));r.href=Le+t.path,n&&(r.className=n),location.pathname===r.pathname&&r.classList.add("current"),t.kind&&(r.innerHTML=``),r.appendChild(document.createElement("span")).textContent=t.text}else e.appendChild(document.createElement("span")).textContent=t.text}G(X,"a[data-toggle]");G(Z,".tsd-index-accordion");G(Y,".tsd-filter-item input[type=checkbox]");var Se=document.getElementById("tsd-theme");Se&&ge(Se);var je=new U;Object.defineProperty(window,"app",{value:je});he();be();})(); +window.translations={"copy":"Copy","copied":"Copied!","normally_hidden":"This member is normally hidden due to your filter settings."}; +"use strict";(()=>{var Ce=Object.create;var ie=Object.defineProperty;var Oe=Object.getOwnPropertyDescriptor;var _e=Object.getOwnPropertyNames;var Re=Object.getPrototypeOf,Me=Object.prototype.hasOwnProperty;var Fe=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var De=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of _e(e))!Me.call(t,i)&&i!==n&&ie(t,i,{get:()=>e[i],enumerable:!(r=Oe(e,i))||r.enumerable});return t};var Ae=(t,e,n)=>(n=t!=null?Ce(Re(t)):{},De(e||!t||!t.__esModule?ie(n,"default",{value:t,enumerable:!0}):n,t));var ue=Fe((ae,le)=>{(function(){var t=function(e){var n=new t.Builder;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),n.searchPipeline.add(t.stemmer),e.call(n,n),n.build()};t.version="2.3.9";t.utils={},t.utils.warn=function(e){return function(n){e.console&&console.warn&&console.warn(n)}}(this),t.utils.asString=function(e){return e==null?"":e.toString()},t.utils.clone=function(e){if(e==null)return e;for(var n=Object.create(null),r=Object.keys(e),i=0;i0){var d=t.utils.clone(n)||{};d.position=[a,u],d.index=s.length,s.push(new t.Token(r.slice(a,o),d))}a=o+1}}return s},t.tokenizer.separator=/[\s\-]+/;t.Pipeline=function(){this._stack=[]},t.Pipeline.registeredFunctions=Object.create(null),t.Pipeline.registerFunction=function(e,n){n in this.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[e.label]=e},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn(`Function is not registered with pipeline. This may cause problems when serialising the index. +`,e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(r){var i=t.Pipeline.registeredFunctions[r];if(i)n.add(i);else throw new Error("Cannot load unregistered function: "+r)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(n){t.Pipeline.warnIfFunctionNotRegistered(n),this._stack.push(n)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");r=r+1,this._stack.splice(r,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");this._stack.splice(r,0,n)},t.Pipeline.prototype.remove=function(e){var n=this._stack.indexOf(e);n!=-1&&this._stack.splice(n,1)},t.Pipeline.prototype.run=function(e){for(var n=this._stack.length,r=0;r1&&(oe&&(r=s),o!=e);)i=r-n,s=n+Math.floor(i/2),o=this.elements[s*2];if(o==e||o>e)return s*2;if(ol?d+=2:a==l&&(n+=r[u+1]*i[d+1],u+=2,d+=2);return n},t.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},t.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),n=1,r=0;n0){var o=s.str.charAt(0),a;o in s.node.edges?a=s.node.edges[o]:(a=new t.TokenSet,s.node.edges[o]=a),s.str.length==1&&(a.final=!0),i.push({node:a,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(s.editsRemaining!=0){if("*"in s.node.edges)var l=s.node.edges["*"];else{var l=new t.TokenSet;s.node.edges["*"]=l}if(s.str.length==0&&(l.final=!0),i.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&i.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),s.str.length==1&&(s.node.final=!0),s.str.length>=1){if("*"in s.node.edges)var u=s.node.edges["*"];else{var u=new t.TokenSet;s.node.edges["*"]=u}s.str.length==1&&(u.final=!0),i.push({node:u,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var d=s.str.charAt(0),m=s.str.charAt(1),p;m in s.node.edges?p=s.node.edges[m]:(p=new t.TokenSet,s.node.edges[m]=p),s.str.length==1&&(p.final=!0),i.push({node:p,editsRemaining:s.editsRemaining-1,str:d+s.str.slice(2)})}}}return r},t.TokenSet.fromString=function(e){for(var n=new t.TokenSet,r=n,i=0,s=e.length;i=e;n--){var r=this.uncheckedNodes[n],i=r.child.toString();i in this.minimizedNodes?r.parent.edges[r.char]=this.minimizedNodes[i]:(r.child._str=i,this.minimizedNodes[i]=r.child),this.uncheckedNodes.pop()}};t.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},t.Index.prototype.search=function(e){return this.query(function(n){var r=new t.QueryParser(e,n);r.parse()})},t.Index.prototype.query=function(e){for(var n=new t.Query(this.fields),r=Object.create(null),i=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),l=0;l1?this._b=1:this._b=e},t.Builder.prototype.k1=function(e){this._k1=e},t.Builder.prototype.add=function(e,n){var r=e[this._ref],i=Object.keys(this._fields);this._documents[r]=n||{},this.documentCount+=1;for(var s=0;s=this.length)return t.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},t.QueryLexer.prototype.width=function(){return this.pos-this.start},t.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},t.QueryLexer.prototype.backup=function(){this.pos-=1},t.QueryLexer.prototype.acceptDigitRun=function(){var e,n;do e=this.next(),n=e.charCodeAt(0);while(n>47&&n<58);e!=t.QueryLexer.EOS&&this.backup()},t.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(t.QueryLexer.TERM)),e.ignore(),e.more())return t.QueryLexer.lexText},t.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.EDIT_DISTANCE),t.QueryLexer.lexText},t.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.BOOST),t.QueryLexer.lexText},t.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(t.QueryLexer.TERM)},t.QueryLexer.termSeparator=t.tokenizer.separator,t.QueryLexer.lexText=function(e){for(;;){var n=e.next();if(n==t.QueryLexer.EOS)return t.QueryLexer.lexEOS;if(n.charCodeAt(0)==92){e.escapeCharacter();continue}if(n==":")return t.QueryLexer.lexField;if(n=="~")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexEditDistance;if(n=="^")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexBoost;if(n=="+"&&e.width()===1||n=="-"&&e.width()===1)return e.emit(t.QueryLexer.PRESENCE),t.QueryLexer.lexText;if(n.match(t.QueryLexer.termSeparator))return t.QueryLexer.lexTerm}},t.QueryParser=function(e,n){this.lexer=new t.QueryLexer(e),this.query=n,this.currentClause={},this.lexemeIdx=0},t.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=t.QueryParser.parseClause;e;)e=e(this);return this.query},t.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},t.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},t.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},t.QueryParser.parseClause=function(e){var n=e.peekLexeme();if(n!=null)switch(n.type){case t.QueryLexer.PRESENCE:return t.QueryParser.parsePresence;case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expected either a field or a term, found "+n.type;throw n.str.length>=1&&(r+=" with value '"+n.str+"'"),new t.QueryParseError(r,n.start,n.end)}},t.QueryParser.parsePresence=function(e){var n=e.consumeLexeme();if(n!=null){switch(n.str){case"-":e.currentClause.presence=t.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=t.Query.presence.REQUIRED;break;default:var r="unrecognised presence operator'"+n.str+"'";throw new t.QueryParseError(r,n.start,n.end)}var i=e.peekLexeme();if(i==null){var r="expecting term or field, found nothing";throw new t.QueryParseError(r,n.start,n.end)}switch(i.type){case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expecting term or field, found '"+i.type+"'";throw new t.QueryParseError(r,i.start,i.end)}}},t.QueryParser.parseField=function(e){var n=e.consumeLexeme();if(n!=null){if(e.query.allFields.indexOf(n.str)==-1){var r=e.query.allFields.map(function(o){return"'"+o+"'"}).join(", "),i="unrecognised field '"+n.str+"', possible fields: "+r;throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.fields=[n.str];var s=e.peekLexeme();if(s==null){var i="expecting term, found nothing";throw new t.QueryParseError(i,n.start,n.end)}switch(s.type){case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var i="expecting term, found '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseTerm=function(e){var n=e.consumeLexeme();if(n!=null){e.currentClause.term=n.str.toLowerCase(),n.str.indexOf("*")!=-1&&(e.currentClause.usePipeline=!1);var r=e.peekLexeme();if(r==null){e.nextClause();return}switch(r.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+r.type+"'";throw new t.QueryParseError(i,r.start,r.end)}}},t.QueryParser.parseEditDistance=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="edit distance must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.editDistance=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseBoost=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="boost must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.boost=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},function(e,n){typeof define=="function"&&define.amd?define(n):typeof ae=="object"?le.exports=n():e.lunr=n()}(this,function(){return t})})()});var se=[];function G(t,e){se.push({selector:e,constructor:t})}var U=class{constructor(){this.alwaysVisibleMember=null;this.createComponents(document.body),this.ensureFocusedElementVisible(),this.listenForCodeCopies(),window.addEventListener("hashchange",()=>this.ensureFocusedElementVisible()),document.body.style.display||(this.ensureFocusedElementVisible(),this.updateIndexVisibility(),this.scrollToHash())}createComponents(e){se.forEach(n=>{e.querySelectorAll(n.selector).forEach(r=>{r.dataset.hasInstance||(new n.constructor({el:r,app:this}),r.dataset.hasInstance=String(!0))})})}filterChanged(){this.ensureFocusedElementVisible()}showPage(){document.body.style.display&&(document.body.style.removeProperty("display"),this.ensureFocusedElementVisible(),this.updateIndexVisibility(),this.scrollToHash())}scrollToHash(){if(location.hash){let e=document.getElementById(location.hash.substring(1));if(!e)return;e.scrollIntoView({behavior:"instant",block:"start"})}}ensureActivePageVisible(){let e=document.querySelector(".tsd-navigation .current"),n=e?.parentElement;for(;n&&!n.classList.contains(".tsd-navigation");)n instanceof HTMLDetailsElement&&(n.open=!0),n=n.parentElement;if(e&&!e.checkVisibility()){let r=e.getBoundingClientRect().top-document.documentElement.clientHeight/4;document.querySelector(".site-menu").scrollTop=r}}updateIndexVisibility(){let e=document.querySelector(".tsd-index-content"),n=e?.open;e&&(e.open=!0),document.querySelectorAll(".tsd-index-section").forEach(r=>{r.style.display="block";let i=Array.from(r.querySelectorAll(".tsd-index-link")).every(s=>s.offsetParent==null);r.style.display=i?"none":"block"}),e&&(e.open=n)}ensureFocusedElementVisible(){if(this.alwaysVisibleMember&&(this.alwaysVisibleMember.classList.remove("always-visible"),this.alwaysVisibleMember.firstElementChild.remove(),this.alwaysVisibleMember=null),!location.hash)return;let e=document.getElementById(location.hash.substring(1));if(!e)return;let n=e.parentElement;for(;n&&n.tagName!=="SECTION";)n=n.parentElement;if(!n)return;let r=n.offsetParent==null,i=n;for(;i!==document.body;)i instanceof HTMLDetailsElement&&(i.open=!0),i=i.parentElement;if(n.offsetParent==null){this.alwaysVisibleMember=n,n.classList.add("always-visible");let s=document.createElement("p");s.classList.add("warning"),s.textContent=window.translations.normally_hidden,n.prepend(s)}r&&e.scrollIntoView()}listenForCodeCopies(){document.querySelectorAll("pre > button").forEach(e=>{let n;e.addEventListener("click",()=>{e.previousElementSibling instanceof HTMLElement&&navigator.clipboard.writeText(e.previousElementSibling.innerText.trim()),e.textContent=window.translations.copied,e.classList.add("visible"),clearTimeout(n),n=setTimeout(()=>{e.classList.remove("visible"),n=setTimeout(()=>{e.textContent=window.translations.copy},100)},1e3)})})}};var oe=(t,e=100)=>{let n;return()=>{clearTimeout(n),n=setTimeout(()=>t(),e)}};var pe=Ae(ue());async function ce(t,e){if(!window.searchData)return;let n=await fetch(window.searchData),r=new Blob([await n.arrayBuffer()]).stream().pipeThrough(new DecompressionStream("gzip")),i=await new Response(r).json();t.data=i,t.index=pe.Index.load(i.index),e.classList.remove("loading"),e.classList.add("ready")}function fe(){let t=document.getElementById("tsd-search");if(!t)return;let e={base:t.dataset.base+"/"},n=document.getElementById("tsd-search-script");t.classList.add("loading"),n&&(n.addEventListener("error",()=>{t.classList.remove("loading"),t.classList.add("failure")}),n.addEventListener("load",()=>{ce(e,t)}),ce(e,t));let r=document.querySelector("#tsd-search input"),i=document.querySelector("#tsd-search .results");if(!r||!i)throw new Error("The input field or the result list wrapper was not found");i.addEventListener("mouseup",()=>{te(t)}),r.addEventListener("focus",()=>t.classList.add("has-focus")),Ve(t,i,r,e)}function Ve(t,e,n,r){n.addEventListener("input",oe(()=>{Ne(t,e,n,r)},200)),n.addEventListener("keydown",i=>{i.key=="Enter"?He(e,t):i.key=="ArrowUp"?(de(e,n,-1),i.preventDefault()):i.key==="ArrowDown"&&(de(e,n,1),i.preventDefault())}),document.body.addEventListener("keypress",i=>{i.altKey||i.ctrlKey||i.metaKey||!n.matches(":focus")&&i.key==="/"&&(i.preventDefault(),n.focus())}),document.body.addEventListener("keyup",i=>{t.classList.contains("has-focus")&&(i.key==="Escape"||!e.matches(":focus-within")&&!n.matches(":focus"))&&(n.blur(),te(t))})}function te(t){t.classList.remove("has-focus")}function Ne(t,e,n,r){if(!r.index||!r.data)return;e.textContent="";let i=n.value.trim(),s;if(i){let o=i.split(" ").map(a=>a.length?`*${a}*`:"").join(" ");s=r.index.search(o)}else s=[];for(let o=0;oa.score-o.score);for(let o=0,a=Math.min(10,s.length);o`,d=he(l.name,i);globalThis.DEBUG_SEARCH_WEIGHTS&&(d+=` (score: ${s[o].score.toFixed(2)})`),l.parent&&(d=` + ${he(l.parent,i)}.${d}`);let m=document.createElement("li");m.classList.value=l.classes??"";let p=document.createElement("a");p.href=r.base+l.url,p.innerHTML=u+d,m.append(p),p.addEventListener("focus",()=>{e.querySelector(".current")?.classList.remove("current"),m.classList.add("current")}),e.appendChild(m)}}function de(t,e,n){let r=t.querySelector(".current");if(!r)r=t.querySelector(n==1?"li:first-child":"li:last-child"),r&&r.classList.add("current");else{let i=r;if(n===1)do i=i.nextElementSibling??void 0;while(i instanceof HTMLElement&&i.offsetParent==null);else do i=i.previousElementSibling??void 0;while(i instanceof HTMLElement&&i.offsetParent==null);i?(r.classList.remove("current"),i.classList.add("current")):n===-1&&(r.classList.remove("current"),e.focus())}}function He(t,e){let n=t.querySelector(".current");if(n||(n=t.querySelector("li:first-child")),n){let r=n.querySelector("a");r&&(window.location.href=r.href),te(e)}}function he(t,e){if(e==="")return t;let n=t.toLocaleLowerCase(),r=e.toLocaleLowerCase(),i=[],s=0,o=n.indexOf(r);for(;o!=-1;)i.push(ee(t.substring(s,o)),`${ee(t.substring(o,o+r.length))}`),s=o+r.length,o=n.indexOf(r,s);return i.push(ee(t.substring(s))),i.join("")}var Be={"&":"&","<":"<",">":">","'":"'",'"':"""};function ee(t){return t.replace(/[&<>"'"]/g,e=>Be[e])}var I=class{constructor(e){this.el=e.el,this.app=e.app}};var F="mousedown",ye="mousemove",H="mouseup",J={x:0,y:0},me=!1,ne=!1,je=!1,D=!1,ve=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);document.documentElement.classList.add(ve?"is-mobile":"not-mobile");ve&&"ontouchstart"in document.documentElement&&(je=!0,F="touchstart",ye="touchmove",H="touchend");document.addEventListener(F,t=>{ne=!0,D=!1;let e=F=="touchstart"?t.targetTouches[0]:t;J.y=e.pageY||0,J.x=e.pageX||0});document.addEventListener(ye,t=>{if(ne&&!D){let e=F=="touchstart"?t.targetTouches[0]:t,n=J.x-(e.pageX||0),r=J.y-(e.pageY||0);D=Math.sqrt(n*n+r*r)>10}});document.addEventListener(H,()=>{ne=!1});document.addEventListener("click",t=>{me&&(t.preventDefault(),t.stopImmediatePropagation(),me=!1)});var X=class extends I{constructor(e){super(e),this.className=this.el.dataset.toggle||"",this.el.addEventListener(H,n=>this.onPointerUp(n)),this.el.addEventListener("click",n=>n.preventDefault()),document.addEventListener(F,n=>this.onDocumentPointerDown(n)),document.addEventListener(H,n=>this.onDocumentPointerUp(n))}setActive(e){if(this.active==e)return;this.active=e,document.documentElement.classList.toggle("has-"+this.className,e),this.el.classList.toggle("active",e);let n=(this.active?"to-has-":"from-has-")+this.className;document.documentElement.classList.add(n),setTimeout(()=>document.documentElement.classList.remove(n),500)}onPointerUp(e){D||(this.setActive(!0),e.preventDefault())}onDocumentPointerDown(e){if(this.active){if(e.target.closest(".col-sidebar, .tsd-filter-group"))return;this.setActive(!1)}}onDocumentPointerUp(e){if(!D&&this.active&&e.target.closest(".col-sidebar")){let n=e.target.closest("a");if(n){let r=window.location.href;r.indexOf("#")!=-1&&(r=r.substring(0,r.indexOf("#"))),n.href.substring(0,r.length)==r&&setTimeout(()=>this.setActive(!1),250)}}}};var re;try{re=localStorage}catch{re={getItem(){return null},setItem(){}}}var Q=re;var ge=document.head.appendChild(document.createElement("style"));ge.dataset.for="filters";var Y=class extends I{constructor(e){super(e),this.key=`filter-${this.el.name}`,this.value=this.el.checked,this.el.addEventListener("change",()=>{this.setLocalStorage(this.el.checked)}),this.setLocalStorage(this.fromLocalStorage()),ge.innerHTML+=`html:not(.${this.key}) .tsd-is-${this.el.name} { display: none; } +`,this.app.updateIndexVisibility()}fromLocalStorage(){let e=Q.getItem(this.key);return e?e==="true":this.el.checked}setLocalStorage(e){Q.setItem(this.key,e.toString()),this.value=e,this.handleValueChange()}handleValueChange(){this.el.checked=this.value,document.documentElement.classList.toggle(this.key,this.value),this.app.filterChanged(),this.app.updateIndexVisibility()}};var Z=class extends I{constructor(e){super(e),this.summary=this.el.querySelector(".tsd-accordion-summary"),this.icon=this.summary.querySelector("svg"),this.key=`tsd-accordion-${this.summary.dataset.key??this.summary.textContent.trim().replace(/\s+/g,"-").toLowerCase()}`;let n=Q.getItem(this.key);this.el.open=n?n==="true":this.el.open,this.el.addEventListener("toggle",()=>this.update());let r=this.summary.querySelector("a");r&&r.addEventListener("click",()=>{location.assign(r.href)}),this.update()}update(){this.icon.style.transform=`rotate(${this.el.open?0:-90}deg)`,Q.setItem(this.key,this.el.open.toString())}};function Ee(t){let e=Q.getItem("tsd-theme")||"os";t.value=e,xe(e),t.addEventListener("change",()=>{Q.setItem("tsd-theme",t.value),xe(t.value)})}function xe(t){document.documentElement.dataset.theme=t}var K;function we(){let t=document.getElementById("tsd-nav-script");t&&(t.addEventListener("load",Le),Le())}async function Le(){let t=document.getElementById("tsd-nav-container");if(!t||!window.navigationData)return;let n=await(await fetch(window.navigationData)).arrayBuffer(),r=new Blob([n]).stream().pipeThrough(new DecompressionStream("gzip")),i=await new Response(r).json();K=t.dataset.base,K.endsWith("/")||(K+="/"),t.innerHTML="";for(let s of i)Se(s,t,[]);window.app.createComponents(t),window.app.showPage(),window.app.ensureActivePageVisible()}function Se(t,e,n){let r=e.appendChild(document.createElement("li"));if(t.children){let i=[...n,t.text],s=r.appendChild(document.createElement("details"));s.className=t.class?`${t.class} tsd-accordion`:"tsd-accordion";let o=s.appendChild(document.createElement("summary"));o.className="tsd-accordion-summary",o.dataset.key=i.join("$"),o.innerHTML='',be(t,o);let a=s.appendChild(document.createElement("div"));a.className="tsd-accordion-details";let l=a.appendChild(document.createElement("ul"));l.className="tsd-nested-navigation";for(let u of t.children)Se(u,l,i)}else be(t,r,t.class)}function be(t,e,n){if(t.path){let r=e.appendChild(document.createElement("a"));r.href=K+t.path,n&&(r.className=n),location.pathname===r.pathname&&r.classList.add("current"),t.kind&&(r.innerHTML=``),r.appendChild(document.createElement("span")).textContent=t.text}else e.appendChild(document.createElement("span")).textContent=t.text}G(X,"a[data-toggle]");G(Z,".tsd-accordion");G(Y,".tsd-filter-item input[type=checkbox]");var Te=document.getElementById("tsd-theme");Te&&Ee(Te);var qe=new U;Object.defineProperty(window,"app",{value:qe});fe();we();})(); /*! Bundled license information: lunr/lunr.js: diff --git a/docs/assets/search.js b/docs/assets/search.js index 5b8ef7d8..a2781e76 100644 --- a/docs/assets/search.js +++ b/docs/assets/search.js @@ -1 +1 @@ -window.searchData = "data:application/octet-stream;base64,H4sIAAAAAAAAA8WdXbPjtpGw/8pbZ25PJsK35Lskm6117Wbtjb2biymXiyPxnGFGhzqRqPFMUvnvbxEgKKDZDYIUxrny8QgfTTTQaDxoAP94OJ9+uTx88+4fDx+b9vDwDePbx4e2eqkfvnn4Q3PeX4/V+ffXp6f6/PD4cD0fH7552B+ry6W+/Db++e2H7uX48Oh/ffjm4eGfj75UxfhY6v7UXrrzdd+dsop8E6cPin98eK3OddtNJb1VzDZcjjWf6+rw7eFzVq23tLcau8vhN83lN6/n5lPV1cvr/+XcdHWuAEHichI0Xf1yyarepyxX90v1+Xfnc/UltwHi9OXkuDR/r7MEGBIu7HF8I28jqH557b5kVeZT3lPb0/V4zKpsSHhPXa/XLqsql+6emp7rvJpcuntq6k62w2XVdkt7T437D/X+4w+5HTJMfd94CIz8vzef68P35+Z0brov/3Otr1NZpkmKGHui2CyDj0hNDfeuOk87EFW3T53TvPkytKdDjXctSo4wR1lZ9tVrtW8Qq0Sq45bhbl1gPZ1URcr85tdZt9X7Y+2TZtc+ybZCjoypgKw+OR3k14pOCVSlyWlhwZe2f1tiRt7c0t9bMzZVULWmpov8Gg/1sm+9pb+35v2xrhbY1CH13bWSExZZ88JJK1+Wd01Xn6vudP4pW5iffZafV7aF0omJ879Ph1u7NG1Xn5+qPSpNnzI5h0Ym7FB11cJy3wx5cr/Rik5U/wptZ6YIr8uNJxQj8FN+9/7Snat99/3pNLVo4Y9FfJNJgVleSSQjtQg8nT/W5/5Dpwuxaa1x6vW11i9N1yFr+GmNt5Tra3s9n16aS/3n+vJ6ai/1n6rXjIrRTIjFOHX1vqsP69r9Dx9Ozb7+oTtXXf3c1Jc/nNqu/jydNShN0PnLSdpVl4//fm33XXNqc/oITJ9jZXPksL6wFX9OglvKonU37XNu5S5pqdoP9aU7n77k1R8lLv39f2ra5uX68t/Xl/f1+bunv9hOmNMpZgsoJWkPyr788VPddn+0liOnv2B5irbcj81Lfemqlxy7M8lQSpKXtbojM5azMU/Nsf6+6j5kSBMkLVf/6bXLaYkhWbl6X6rPK3VCZbxLtqlv3Sf48cvr1L9GPBKQ/o5+O5VjteFJ5y4qY5/gu9fcaRLJUlSa/6uOzeEvUy/hy0IRM8opJXfTNl1ghnPcQyTLPdJozmSwPdE+nbJksMkW+aegJjsD5c5URb8R50CYHw4J0Br7Etd97Zpj8/eq70YZEsSpy7VAl2feOtKqrf5+58NnO/u/4eXt+5/qy6V6rt34/jbHWSKylbIBz3X3l3GR+Z/1l99/WSBbMnMpCS++ktgc5rh2ZM5ltiNDmnwjP1vAetkctP6xuny84Ds5iJmZZrmrbW4lLWoRLNt6Od5fm+NhjSRkxoJ9+VY8ylFnmmcBSV0gzw9dXR0zl9uTHKVkubbLpcHylNaVL/q79vfV/uP35/pyuZ6XKI4soHjLrZc1o4hyHgC6K4WsPOF+1P0ewPvrJWfiGJKVm/stMm+r4+/z6gfJC8pxuc3XubJMs5QbYa21tp5efvfa7840p/bH019yXbWcMn41efNmu4xCSkn8obqEdWWIN82xfh6uDoeFtU9zrK/9XL+cPtULBUAzrZfh2Fy6sLDL9+fTa33umqzdn3Tu9VI911GxK73rvFK+yjqljPSLyvvq30GGqCyQHY1XKSQv3PpaIieSt6CX9m/1U3U9dgtHOpnxjvXPh+p4/OPnen/trFpypJhmKdUytSs1ZxE4plz/7S/V6x+zK4wS39He/dbNfVtkX51U4/GHhDR3tcawEZm/ZXnnWr89/GdzPA5kaqHHhucs1ebD991sZH6bRHnK+d2Xuru+/sfplGUSgrQlPf8/VU2OXRwTlqv7ff10Olvz5kZ9c2oz24LOWU666qmrz2uEIzMW7Df99PC/r4eqQ3yU/+2HT+4cM1dIub2w0+lSLxp6SJZi1rf/9D+c66qr/+1LW700+3wzRWctaRfaw9LFbtJeruYTTeBS5nYsPFexnmTb/nft4YfeIC7rUXTWgvs5USVRH1klJlZCOWnP9XNz6eqzK36Ye/+r/6c2q+vN5S8v6Xftvr5X2lQZ5SQ+1Pe27nwJhee7Wy+zfS93tptmK2sLf+i94OvrOqeSzFxcxq65dM3+slpMMn8x21m17amzKD9zITrNUY5Btodj7no4SlxKgnN9aC7duXl/7Wq7i+b2+LLsCJWz2N7N6Jf90J2OdXvrHcucvNxyvoLc/ZmWtmuq4/FLsW/ILrNcH/E7icU+Z0WRZcfczVp/ezjWNmwrewjieUvJdzvXsMRG4bm+VpuF259r2w4r46vEEiygx1S+srpd7gNR+QpHYP2uPfSxi38eY9BzY7CwjF+j79kK/DGYhX0O5i0/h4+sY7GEVO5y5OGmpKguq6zs+NtkCV9L1n4sNu3zaklh/q8hZ7Q+tWBkbdumSyo33sf9p2/zAoth+qKSrLLVVL6yjGUFtPgqtK46HBaJAtN/jV7/xz4Oe808EWUs56X24QmLGgnJUkqap2P1fCv4d5f/PrnZMSe2i85abtR9qC4Lw+CmOQrvxmZ6uvXX2RF2Ny3kyhClLrc3t0SGOHUpGbqlIbiTDOVG0PXyYVHA9jRHufECys6Z1pEsd7RNeOB/cBL+cLz2WPR77Nj/NEmRw/9EsVlXACBS37s1RYlz9wZVvqxr3UCyJQs7g+kvyTh+RAm66BDSEinQQGRKikXhyAt6IBmUQHa5rNCE/zf8Q9N+qPtbDFeKR0QsULJlxC0UEiy5aUs3XebWbUEhM3dTUiKv2FMp9AHLttSob1i/rVb4M/J3M+c+Zd2eZqHPWbrVSX3MPRued3xK1nlQSuZfvmbfz74kKC3d9KqgMhJRFwhR0mDXCJWRJONyIUqohVcMFVVm7s1DafWuuX+o0GdkXmdCyb/iUpNCgpN3nVCiZt14Ukg49CIUSrDZ61BKqTrvlhRS1cvvSilm0tErJEiXkcC8d0uBXy9BT+zpSyaKNQ5+9wRtwuduoCgmWOpiCkq8vOspinnTeXcQJBZOueeKvo6k1Bn4hQInTsTfKffs3QVkN03dYFCsTedvE0i0ZNaNAncPIvRUNTnHzZ2tLrWITx18pu1y5vHnQkLOnZKl5EydlS0j2dwJWkqy1DnaUuva2dO19HyXPGNbRr4lJ28pQXPP3xazMjknGRN2Zu48YyFLTRzzIw00ctKvjCSJM4e0b4qePCykQfSsH6kw6q2BuxENfg6QRjHT04BFJUlsV8/IlHkWotA0kHtMjcT0Kw6rFRI98wwbOV0sP8lWSPDsQz7kVtKaoz5fRfj5E0B537DsHFDJDjR3KCTZfZYcDSkkdF6kaZqo/QsYejosjRI3PzitkJjZ0T3kGmNNjE8x4dOBFbTM+eEV94i6M0zdohGCVHB52e9AX347TZCMdJg88JSKooAJisRQoIXmP+101+41XvfyY/W5khAb1bgYC4/X57dGYk+aapAVh4mXyJO5/UxLd+eBvlxZl+1o4uKWOb65VOL8TeW01Pcfk82VfOn+MS53qeOy2b05N1aL6Mv3Rmrlyrk2Touw1oWjtFJfkRGjhQu5KEIrXwIiNACXISMwYJ0UaJQYLsOiGLGEBNlxCKmmWBaFkCsNFYOAS7I0AiFXioz4A1ygktEHyxSYG3uQUmnxyIPcT8iMO8BlLx11kCs0GXOAi3l/xEGuYGi8AS7UfdEG2erNizUg1Fs40iDfMqNxBoTHvyTKIF8CPMaA8vPuiDDIFynxxmnp6IJ8oVKxBbhoBSILFixis+IKyCXtXVEFd0pJ7YQvEnbpjniuzLPxBES3XBtNsKAt52MJyBZcH0mQP2DoN4MLRxFk85VUDAFlc0tEEOQKOBc/gMu4NnogV6q52AFcqrWRA/noYjZugJrDVkcN5Mq2JGYAF7JExMACS5ITL0DaknuiBbKtMLE9TxjfhTvzuVIk4gQov3JxlEC21tAYAUJJiyIE8hEcHh9AobZl0QELpUjsliblKbE7mitqblwAAWZKRwVk2/+8mABiGigcEZBNMHPjAQhkWTwaYJ3g87EAOfIXjARY1Gnm4gASXaZYFECuwHkxACmyVSwCIFfk9P4/Lmqh3f9cEbP3/ol1QfGd/3zB0/v+lLyFdv1TYio9SvlttBFvFytP1b6+/Pbb2Q34CJ5FFAotJv1Y6rdL4T9eBwX9s6uCZB+vBiP6+VUAB5CoYuZVCliFVkrc1Przz9HGVbKKty7xb3S6rrdeIhKfTlxbvNqMJzcKfNytFv99jM98YCAY8Y2xy4xXnH4+o8CX2Qr8R3E581FOHOJ7oAOOVzj3SEeBbxqqGL9q5qO8RMRnURQErzv3nbECnwmq8p+7nflcKCHx2RRmwWXJfeCswGeDqt6OmVIfDeUjPjpBcXBhFryrVuDTp7WN5mhu5CKCEm2QQ4tw8da861agVRLVjs2zmWmelOiU+U5zKsLcLnudq4SBR2scG2ZuniYEptskue9Diji731O+VbAqxyljrr9QIi9rF7hPskjWuRelv14r+VBd31hzE+zMB1CeLbXTRfifuS9+l/B1QV2+JeaM8ERGurvQm2mkqtKbaOW7xqS+0ajMuSCosHQYeZ8nvqrURY+P/55cWYYL1D7Ht8Ti0v+Wv0z9VJ8vhMmPCntzS4i3yigWURGlj7iWpBs0VwUIDCQrQWICl1RjFxCWLczUc0u4rqI4jISsZhpBsqSSg5sZU9NcXN00w9pmdAX8ue7OhF8GmxNmWFfxS9NGd4uSFd4Srqyo+pxZ0ZhwXUVYHA1ZWZD4N+zOsUYSKGzApSHUfHepq2PTBuwyq8tgmdYJ0ESvR2RUPs2wruI+fHhRxdMM6yoe+BZ4kYesFia/p9KmfV5Ua5B+XbV/Q94eIuuME682Dth7RykbQb1ytKgzYZdu0z2JunB72cjtn9XJ/Mw48boKn6rmmN2uceKVE/W1/bF5yWjPW8LsinL9WrSiead+zOZFS4d6L6/57ZAzgTChDB6HpcOS14jicpYTpfpUn8MHp/JFGXL+RhRrlfrQVBnT/7RRbMZygvxSNV3eaAhSfuXh4GvyX63mP3YU7t4BMal7HBEZTQ4y3z0kEGGGMVFOmOxBMRXGj4oMe5XbMpnDAmkYNy7KiVIfrxnujE30lYdDfbzObTmMGXqBEh7xksreDhnma5y25L0fauue301DhHBS32sFKElGYzC/FIMylbIJtGiDaSguWraFIEXzhqJ8q2XaC7rRnNko32b7rvm0rMnGLP+SAedqH3nqovYYJC846IA0b29lLJXqKwy7iXBjGYWFWzPwoHC3Mkq33PKhN2k4X0Rh0RYBtqBw6rjarzgMAxF8O2W4esQ3FOxWmFyjWV82QU+LKtjFUDkHI19QTLjDk9gx+z73pqHocHF7bNr6P+xrn+QWSVjqG5iD/tCZTdAXF8S7pO5JltWV1+fz6bykapBhfcWfm25RvVH61dXaPSd4UjtVL8iwumLkKgJyMykSgMhYVJAFowmVZ24zOkOscx209HftH/tuliUPkXF9x7Qb+OC2mWTPjDPcWXE6GIKoPCMkIkOALiceYSIBluvOzrm8Oxaoum4/Zbb4p7sMUN31uzGZxueWeEmFWHDFj6FjdIut6P85O7QiK2BlGjKSPQlfiN1gvMg3l9SecCr4JKp0f2r31/O5bveoPSbqjnPdKUI/hH4YtmIXyACyFRDi4ov7rkVfn82TiS6lhIj/3rTN5UN96Ini6YoG16dkm2ZfLpRA4pZuY+FTdW56oxwEL6XHgJiOVKo0+1v2eP02O1ATDZTMH7dDju9PxwYfRXQFbyaZiaiyJbGYbmRUXXPpmv3lz/Xfrs25fqFm9IRwyYIKCHquLzV+PoSWyedZV312HOCMABnxkGgJTnqKI7weKuI4EC3OmOlf1iBOgozDGWgRg/zU9PThdLosFWjM9C9rEifB7MENtIBB+uT5jcVddsj0Lxw0vQQZ55WIUWPlp33KVARxwvaGGf9lTXOTIuNkIVpM8B20F/ynuurdkJdpkHHwS/bcGuRJtP00Vf6sSsM4otQ3M3gXEXn22/Jn0dlM+V9ePT+f62diJsir501YxmxzEF+5HOfmCjezR7BatKw+k5IsvwvNChb2qB9mPcQ4RX5fOYQXTfzvhdALUvobNCf+2UD8HFH+TAWnz4oyvW4gSxS4UM8fuXTqfDUkQvxmip8N+kt8zIoQqzlpZoOulotDBLbMSZIKdckSAk6AydWgmwkXrwPDXrfw+Fvq2NmCSXI6qS+o402cH2/sFQfbEsNhVqS58bBCnNSAmJVndkSsOfiHD4lZWVJjYk271M3zB9wozjfLmPcecQTqn2L4J/w5FychMjQoW8ITpodh8FALnp26qzuZOlln7hMu8zVkveeS/ixyfWqPX/3hdG3XfPobkL+gZMPJtKxbezMETRd3kzu+e/jur8DvdF/zAWRJv7LswCm++wsQkvqrfEeG13n3tyXr+GrfewZnMJcP568p3Sv2NFaGaEO+knLBy+LWd+0w8302EMpUtpvOFVhQ9ts9HaVM+GyJBaUHbH+BlDOAf5U01O2+GeLMXbR2jzz3KHNaxFcb2YDBLzKHSRC/dlxQt9HnjYE5Br5Oqi/tHs+4SspUaQWlrg6HUsaFLuor98tSH5AsrehsHiylhotzf/zQX1vxPTazT1IUWTLhpWYtk6YiU0Mi9y06Qpi7H6PLlnTta3RUKxZ+ji75HRnv0RFiLnqQboEM6FtwhAyLHoPL1ifxzikhQ8ZDpzkP6GYMiNTTp9QgyH37tJyIma+hJgRe8RxqGfGXPdlJfMH6FzvLfkT+m6kzH7Lu0dQyH7P0GVXiU+55R3X9h2S9tElInPHU5mrBsp++TMq27O3LbHmoxy8JWZa+fpktR8bzl4RIJd+/XKjGXKieVGzxFzCzPyLzCUxC+tJvYGaLTT6CSQh6/yuY2aKhz2ASYt33Dma+kvMewqSUXPglzAUGHH0Kk3IKl7yFuUAG/DFMcgK/4zXMBULhz2GSBvuu9zAXiJV6EJMQrsCLmAt85TwySzrK972Jea+cFERbJu7S1x2zpZ59FpPqnmvfxVzSnvMPY9KtuP5lzAVDB30ak5rN7nobM39R3iYexyStcInXMbNFnHsek5By7fuY2XLNPZBJyLX2hcwFK9XZJzLJmW31G5nZ0i15JJMQs8QrmUvsSs4zmbRlueedzHy7TGylUeZ44euU2XIknsokPc/Fb2Xm6w59LJNS1aLXMhegFvy5TBKpLHsvc6kctzt3F0oUZfz6wLO7vqLPTdLjbMzwtYXLfc+TguulH/TMn7DyXvSk5q3CT3rm7wPlvulJbfwUf9Rzpejzr3pmfUHBZz2XdZ1bjfi7nqmOM837tUXOe9kziex+fTCfftuTELbQ457ZQma/7kktbYo/77lA9PT7nqTEhR74TAsaHxW5JYLLWXdOZPJ7dqi4fWY0Ed0Afi8S24CVmRXZAIVdtruMVpuxt7xCguRGMipH9jbySmky94xJ2VbsGK+QdNlWJCrs+m3IO+TN3wlOyrxuH3iF3Es3fVGp79nyXdOLc6OV8D58b6xSppRrI5Vwm1g4TinxDRlRSqiIi2KUsusndvJRCTL28VfJgEZJoRIsipGi688OGkg0w7KQgUxZqIABVI6l4QKZMmQEC6DilAwVWKS63ECBhDKLhwlkfkBmkAAqeekQgUyRyQABVMj7wwMyxUKDA1CR7gsNyFVsXmAArtjCYQHZdhgNCsB9+SUhAdn14wEBhB93RzhAtkB4MABhjO8KBcgWKRUIgApWIAwge/GTFwRArHzuCwG4T0Zq63qJqEu3sDMlnt38x7vj2q3//Hac3/inWm/9tn/2MEE3/fEZ6q4t/1xOktrwJyxsie3+TPHmNvtRCddu9WfKNLfRj8q0dps/G0LMbvITs9XqLf5MyZZs8KMiltjez7cdOZv7lPW4Z2s/1+YSu+m4qV24kZ4pQ2JTn/AaF2/p5+oL3dDH1bNoOz8boeGb+QQqW7aVv0yGxC5iSpoSu4b5g4vYxKfG071b+JmC5W7g49yn9PZ97iSUt3mPz0WFt+5zsWjuxj3OQYtv268Se37TPkP6glv2S7rL3IY93VmKbddnipu3WZ/AZsW26jMFTm/Uo4IW2qbPFDB7kx5fihTfos8WO71BT0hbaHs+JWS8Of9H7M0mty8f/pTcOk9e20yU9WbmNu9IroT4/R4SIX7wU1L88NpJm+m/TqfX/70xHvSe2rGy4Jq/7MzpAIecZ1+XVfUm+Rhs/jcTQtLPZS4Uc+YRzbsFnXlacKG0OQ8OrhF50seR182GLn775e4BCoqaHZ+BUPhQ+hbscE/vb18yDOaKeWOT4LJ6SYjCO2snv52vIki4qiK810VVJLrStPCF1+X7GrJf23hLv0J5avc5Ve1nn0m4/3P2dfZN/2+tRJRxaM/102x9PtVX/ShbyfjS6mb2s5xQVPeuzy9Nm34KZejfQcqv+n1jRdnPnLy9yUZ85qG57E9tW+9TT+AMCCFM+lU/9FZT5uslbwPZiA/92AQcnqp4SPRVP66vI/sNkrdWouRMES1Kp5X2P+fPGL/MTT5jccPCK/FqdigfNUGFq6dUZZNt3oUVXalXCSY1XZOvEGRU5R/T+reqq7JqBBlWVzy8SPuHD1Xb1qm+fqt6kmV15bcnKMP35n4gXhOcCJLMvl4V4Q7f9+fmdG6CXfSkToicS0RZaB1mKh/ntVmjbwvCP2BWeSsUtkJJq1smrnW0orNTvS0BiEwFvrV/65P0jZclUpz+V2mFoMpsT8DmDmWl/IF62efH6X+Vzw+qzHZhbe5Q1vTn/1d16YZB0/y9PixtDTz7r9k4iATZ65ewrbAvIZpuf6yrc/rp5Im00zy/SiOBajOdTJsfSkw0xofqMvd660SqaZ5fpTFAteM8M+ubuiKA0HespgIzn7uiKjavwJUVz/v62eVVfFoCxa4puZLZf5WWoSUYO0qe8U18ykzb3U7IrG4/sohftQ1xKcZ2zDPMM59EtOVwRb4PU3EZyafaJl+QzP6rtCEtQT7wsaUlPoX0CY51V9/TfHMl/EqeQUKIbCAxOAep78FpRfZ20J1bP8sfrhw2UdY9VjlznmKhELdcJURw0ftLRRhzFRBh6TOdgyrWPM1JU5FFz3F6LrL8CU7SFWwu3emMYoeEBLdc60SYvrxrSQ++IRb/eO+eGFLa3LYYkI7+jO/aY9MSXxH9du9HTAub+4ZYNNwI/jDDBsPf803ep+bcXaujjfBqD/07gZeuennNquANnRn/zOgT8K+MH+PBxIhT5H/pEOGK7jkiZb4J0uNfA0RNVtu0z8vqdRnuqdiuwbO/dkx9T5Uv1ef/WVRrmOGeii89cWi7pjoev/zQnY41arQxCdCcd4myrPoSVT5VzTG/zcfUC6ucPhX7LbEDc/v13nADUFIq4iAQieIIhLcLK0la6vlqhsegc2q6JV1b2Zl6phpWNT1quKyiS1dXR8KKwbqCtGurez8DwGCV73PgV0YXmTl8kuo1GcdOZoWZjrF+zWQX6f9Wd1WD7syhCZdu2+KxOHTRb4JsqQ+E8s9eX/CfdaI/JyS55V0nDt70s+9fB4mWNvnist/AfHNfOveKc/tpQeUu9Z1VLtvqJSRZseG7RsDr/mPdrRctzF5MqNRG9KxIs3vRKYHw1+h/nK5+bj9khwDPMLGQNWWPMfvZOaW98SlTbZKEfLOvxQeV5b0On6xu/jX4oL7M19+TFSZfew/qmn/dHVYzeeu87zb0A+f213QXCK6q890dPw0Q/ZosM/eaummJWZfUxWJSIKiuDjkVDumQMwyT1w2z6o18jkS9Q7pi9b6fGt9E7e9xW3unDC/V51wBbkmX6Ric979kVncpUJe7W2EynyRqneS4q36ns+m5blK9tIkma4xvoPhbph14c0t6R31DEEROfbekd9RngwuybNKQ8I663jVdfa660/mnnAp/9ql/Xl5r4CREaajA1UmifIehDW/bmi3yTQtv1iK/JxVluK9eqz3hzxEVB1kmpg49mZYtzIXwdQlBJlaoiBCEXZoXJ2Ge1goWG5DoGqUMeai7lO4TI7oTZl4K6mKYO9sCGNMc7UxtXBFRnuslo9alLiwCNPXzYmAWv4go8SyQYUwmk0ERMZAJYl4WYp5YLVAUQGD3CP+vOuJqCn8vQ84mJc4Ds0jIhSdRptUlj6PkVOXktYeCl3ygz7C+4n49/n19fjqdXyrizNu08mmm+wTwKPe7175PEqdXcTGwrIWF6TdorkQETJZIYwFlBEuj8rRMGax8qTjLhShW9cyuQVqKnH2DHIEuM0FSUIYo/fpqyc2oaY3p7aicytxd1+Qx+GmVcYb1Fb+ezqjHMa1xSLm+KvufrKqGlHmzZk7VByLKZFp1nxKc5Lu38teE948081KXP28IgXs/ZwbQwos+s8zKuWovT/W5v5gm05bEOQqKkooLQuRAI4HuFqK6fMx1tsa0d1Uf44foYvC/nKvXVzySHE+Z71ae68vpiFu1RNFvbtkoJoF+wPLo4Awh5kOCiUL8R5BN81fitHlaqL+mDp7/Sg3z14wj6WSr/DVxOn127zwlV97m+WwTxZG7ly/t/s/15XQ94+57SiCYeaVAMKaQio5awAeJyXgsZToJw7iqpZPtrWhkks0tPDWZ3ipAJ9HcKlKT5a0KdJLMrWJuMrxVQ06C2VWlJrugntlw12Ql5GQW1DCdxBLFwx6ftzbDU5YZFUS58+MEEX1l56ZEyOru+WLMDQBKjKwhkRQDan0GnIAkZfQMC5xXcCjl2lE4qTVvQGZUnYjnQCuei+nIrJYIs0CrTIVa0NVNY25IvBf8fH8ngYWlO0goGXkw55IOFgrquqVdXR01P0/qmpmm8aqmWkkfgIBpFqws5gKVYKx4XrRSxiGIVATR5ADEbBhR1qmlv5ybrt8RhOFpwz+nD/mEx9Cq5mh3FqtzdTzWx+ZyOxb35MHdb7Fk2ZFKv3vfTwT74Y7XyZ56/HORWCWkyKxgJSDpfDB/qsKGCFVCXkHLqzdiqVkiwBwlpTlW7jGC6aGqlERYrpJSIWw4JQ6Bhu+Xw108+m1vDD5V0xgzTJZJlpLyEI/Aov122RuwefW/VE2bP/7f3JIDyEIHveXJgT5Bhkkw+wJZVt3TxzD/ggbHJw0Xlu2uFplK9eNi04JmKyfV3Gs3mEipx26WSzD3tg06hBNP2yyXIOMlG0yImYdslsux5N0a1OZnPluzXLLMV2pQyz//SM2aXtsfcbb3wf8J+PDpjotkK2l5XmaeD0BN8Mr3i5e01I/Y5v3ylpspprzc/9kcj8vFjHMVn1mGov8Cw3Zmrfg0Yzk7bh8b+gOymT3jlcFMJSU6vS4XCOYpPP8ukIXa6L9Xjue6+9MyJw3mKNmjL3V7+PG0UCAkU3GZ8HlsnahZZZW3XjEVm7db05i3+yU5XzOdmWuBlQis+Ycv7T639iFtYQl+d1kggk9cUob39XPTUkQ9JQ+RsZwdGgbGUrnQbOWkur4eqs7e+bmcedB571vXBojtD8fr7QbBiVDRr0UA27TELL4Wi7neiUaqv8OHJqUCL29PXSpEjgXUL6s1ZidCRIbV8yAl0QIMiYiTTyGTT1BlCTdPJREBl0HJ+4VMQEpMm3mM8n6xZpglItoCZHm/eATCxMbgPMG8XxyUJCLCzILEVaIsgmWouVz3MHSWPHPoDOtJKx+FzpInA6QhIt3xIHSWVEuwGma0CjwGnTkDZUE2dB666yHoLOnm0BYi1hKyVWJwLiZdpHuzGnSV+owU+CKlzuVe9wuZZhiIgPkI437h1uIDysG7kx6U6hI4TSA7wzxMuF8wDC5gBn6GLRQRBGUNuDCzqKGIQDh6wCWaJw8rRYpjWfqubKuaTC4uqGXyezq6Zf4KW7zAuWtsp2KmPynxNVkfQoW8fveeOiYwTZUfPTV3wpAoO++cISL+nSGvoQiLwl3T1eeGuobVLwpznVRPatnP73+uL9fjvLrj5Pl6v5CHbeeKf3NJH7NNfQ0VSUcFbM7KUicPZueJkhrEl8QoTscoYqX+kDZ2PxS2dZPyckzdD7ilC7GjexCc8FvCH4tAx0mBWcwxkjHn0Ctd3eTEK01tiVqXgs6pDHdwznyZUm4+JdKa3W1KolnwOhViAXfNaYdZ7DqVYDV1zdcL7mtTGlm2b5czTtLodypHIfKbI9o8+J2KV5D75oiYwL5IbypAfXOEmoG+U8FKMd8c4Qjki4z+O4lvjjAo8J2Kch/vzbMFadyL2YN1tDdHmjnYi/Sglaw3R5oM1DsV6A7SmyPTEtCLGKkCnDdvxsvCvNi8dxflzZFtDvJOhSrGePMn50WIl5qzvw7hzfmINDudylsInWY7YyvIKeGjfU1wmmWjEDyJGKV76GSmGCicREW5j01mioOjSVSeO8kkKVC8VO/XNL+vP1SfmsDtdsvq8KdFy/8+I/5KV/DLvYt+WNTcej8UKnV0c/ZRh8WPRXzEmjhZ7BuQBf+iWF7yVNLnb1vn0KZPjkb1T3PdIcJHpDvMf/7cM61U1QLv29id9NHvmD5/enxo2kP9+eGbfzx8qs+XftL/5oG/FW93D48PT019PFwevnnnj03vTy/9k3wPPw2//V/dY5s+hUvy283D47vNo+ZvjdY//fT4zuewP9h/sMnYw+M79ijZW6VllIxFyfjD4zuOlcajZOLh8Z3AkokomXx4fCexZDJKph4e3yksmYqS6YfHd/pR7t4aE3+CjpKZh8d35lGqt5JHqUyUavvw+G6LpNpGqXYPj+92mGS7uHH7tmabRyXf8p2ImxeoweqBYUWyWBP9c9nvGH9U5q1W2zhlrAzWNzpD1cFiffQvAhO9INYI61ueyUep32oTNxCLldI/1vyOodpjsV5YrwCm0Q+KdcO2lKZZrB7Wq4EZtN1jDfEN0St4rB/OiH7BwTix2tliNfNYO1yQfYPH2uFWOzs0Zawe3uuA42XG6uGa7EU8Vg/vdcAZWmasHt4rgeNWItYP75XAxaNibw2oPFaP6LXAJaZyEStI9HrgaH8TsYoEpzq7AMasVwPXWGcXsYZErwZuHuX2LdvEbSRiDQmroS36QbGGRK8GvkPLjDUkejWIDVpmrCHRq0EwTOsi1pDo9SBQXYpYRbLXg0CtjIxVJHs9CNzuxyqSvSIEqkwZ60jaGUejKcGc0ytCGKyVZKwj2StCoDqSsY5krwixQ8yCjFUkez1IVEUyVpHs9SDRiUDGKpK9HiSqIhmrSPV6kKiKVKwi1etBoipSsYpUrweJz86xilSvB4kOIxWrSFm/ALPGCjgGirDaKtaP6rUgMbOtYv0oq58dKmOsH9UrQW3QlLF+VK8EhQ42FetH90pQqCZ1rB/dK0EJzCjoWD+6V4KSaMpYP7pXglLYF+lYP7rXgtJombGCtHXdDPpFwHnrFaG2aMpYR7pXhEK9Lh3rSFs/AXV+dawj3StCo6NNxzoyvSI0qiMT68hQroKJNWR6NWiB2QQTa8j0atDoLGhiDZleDRodlSbWkOnVoFHDaWINGetfo7o0wMPu1aC3j1K+FZu4x5tYQ8ZqaIemjDVkejWYDZoy1tDWunIMS7mNNbTtFWFQXW5jHW17RRjUcm5jHW17RRjUcm5jHW17RRhUR9tYR1tr5jT6RbGOtr0iDKqjbayjrV0GbbHRvgUroV4RBnVAtrGOtr0ituh428Y62m3I9cMu1tHOjiKG1b6LdbTrFbFFtbmLdbTrFbFFR9wu1tGuV8QWHXG7WEe7XhFbhQz3XayiXa+HLbp62cUq2vV62KKeyi5W0c6uVlHjuQMLVqsifMkK16y9Inaor+J+C9P2qtgxPC1Yt256ZexQPbnfwrS9OnaoptxvYdpeITtUV+63MG2vk53C04IF7KbXyg5fbm7AEnbT62WHqsz9FqbtNbND3Uv3W5jWgoYdnhbobYAN6DBkE9xgecOGAA5Acw45bHDVQejgqMMGxw6QOzjwsEHNJoPswcGHDc4UIH5w/GGDTnAMEgiHIDao/WQQQljWwDboqGMQRDgSsUEHHgMsglnmwHomgLEdoEHuiBE+9jhkRlaDDNcgABPMkQkCHAE2wRycYLgGAZ5gFkIwggoBQsEcomC4BgGkYBZFMIaPQMApmKURjOFDEKAKZokEY7gGAa5gFkowjo9BQCyY5RKM42MQQAvmqAVOV5iA4M9qkBPoD2jQEgqGQxYG8AWzkIJxhXZRQDCYcJAJ1yCAGMyiCsYNXjLQoKUVfegkmhho0AILxnd4YqBByywYTlMYABrMYgsmcA0CpsEsuWA4U2EAazALLwgiC9mtpOdrQDaYVIlhAuAGswwDXxQzwDeYpRj4YoYBwsEsx8CdKwYYB7MkA3WvGIAczKIMwhcBmINZmEHMqwB0MIszCJ8BoA5mgQbhMwDYwSzTIHwGBbG7IqkDA8yDWbSBY0sGsAezcAMHlwyAD2bxBo4uGUAfzAIOHF4yAD+YRRw4mGMAfzALOXA0xwAAYRZzoHCOAQLCLOfA8RwDDIRZ0oHjLAYoCLOsAwVaTMPtEk0gLQYwCLOwA4VaDHAQZmkHjosYICHM8g4cGDHAQpglHjgyYoCGMEs9cGjEABFhlnugXwaICEsgEQaYCHNQBMUSDFAR5rAICiYY4CLM0g8cTTAD97gMCScYYCPMEhB82c8AHWEOj6DLeQb4CHOABB+UgJAwy0GIjT7ASJglIfhSnQFKwrb0EpwBTsIsDcFXzAyQEmZ5CL5mZoCVMEtEiMUloCXMMhFicQl4CdsmFnaAmLDtLuG9A2jCHDUh/FXATdiOJdw5gE7Yjie8HUBP2M7tJ+NeJQAozGIShu/2MMBQmEUluLcDKApzGIX4OqA8B1JQ5wGAFGZxCeE8AJTCdolFOYAp3MEU1HngAKZwB1PQ/s4BTOEOpqD9nQOYwh1MQXXMAUzhG0k7iBzQFG6JCe4gckBTuCUmuAfDAU3hG9qZ5ICmcEtMcG+HA5rCLTHBvR0OaAq3wAT3djiAKdzyEtzb4YClcItLcG+HA5TCLS3BvR0OSAq3sAT1djjgKNyiEtzb4QCjcEtKcG+HA4rCLShBvR0OGAq3mARPCXRmGQnq7XAYymEJCe7tcBjOYQEJ7u3wSUgHJ70dDoM6LB7BvR0OwzosHUG/DIZ1WDSCezscBnZYMoJ7OxyGdlgwgns7HAZ3WC6CezschndYLIJ7OxwgE26pCO7tcEBMuIUiuLfDATDhlong3g4HvIQ7XoJ6OxzgEm6JCO7tcEBLuAUiuLfDASzhgt4f4ICVcEHvEHCASrilIbi3wwEp4RaG4N4OB6CEWxaCezsccBIuE6ySA07CHSfBvR0OOAl3nAT3djggJVxK2tvhAJVwh0rwIBQOUAmXCTMJUAm3OISYsQAq4RaHEDMWQCVc0ksBDlgJV45y6Udu3sqNihMDWMItECFGEoAlXPFUwUB5KjHsAC3hSqYKhmFwih6jAJdwi0TIgoHuFL3DzQEv4ZaJkAUD5VkoQlhiAEy4TikPEBNuqQhhtgEx4TqlPMBMuOUihI0HzITrlPIANOGa3vXmgJpwnVIeACfcBZDg/gEgJ1ynlAfQCU+gEw7QCTcp5QF2wh07wT0PwE64SSkP4BNuEm4KwCfcpJQH+Ak3zmqiO2kcABRunPbQnTQOCAq3lIQJdB+GA4TCLSYhViYAoXCLSYiVCUAo3GISPICSA4TCLSbB3WFAULilJEyi20YcIBS+dVYT3XTggKFwy0kYHiXIAUThWxfdLfDPA8rbkrF1HEAUvk3MeACicAtKGB6CyAFF4Y6i4FGIHFAUPsSeoLtRHFAU7iiKxPsxoCjcURSJ92NAUbijKBLvx4CicEdRFN4xAEXhjqLgEYcccBS+c/H5eMcAIIVbWsIUSn44QCnc4hJGmEPAUrjlJZRxATBFWGDCFEpTBKApwhITplCHWgCcIiwyYcqgsd6ApwjLTJjCur4APEU4nqJ2SKi7ADhFbBTdFgLwFLHRqbYAAeIbk2oLECO+2abaAoSJW2xCtQVQnwtQ0Rs0pB0wFeECVIjGAFBFuAAVjQe2A6oihmMxRMlAfy5AhWhmAFaEC1AhmhmQFTEckMGbGaAV4QJU8GYGbEW4+BSNnu0QAK8Ilhh/AgAWwVPjDxAWwVPjDyAWwVPjDzAWwRPjDzAWYUkKOksJAFkETw0/QFkET2kPYBbBE9oDmEW42BSNH6IDnEW42BQtUVXDozQuNkWjoRsCnqZxsSkaPZUl4IEaF5ui0dANMTlUY7Wn0clSwHM1LjZFo6EbAh6tcbEpBg2fEvB0jYtNMagXJeABGxebgkcMC3jGxkIV3GkX8JSNC00xqMclAHERLjTFSOwolgDIRTjkYnBtA+QiHHIxqGskAHIRDrngwcYCIBfhkAvxgQC5CEtVcIMBgIuQTn14LwLERUinPtTlEgC5CItVGB7NLABzEZarsC3eiwB0EQ664JHKAkAXYcEK2+J2AFAX4ajLFnWaBaAuwlGXLd4zAHYRDrtscTsAsIuwaIVt8Z4BuItIcRcBuIuwbIVt0XgvAcCLSIEXAcCLUE6DeN8A5EWkyIsA5EVYusJ2uDkC6EWk0IsA6EVYvMJ2uLsD2ItIsRcB2IuwfIXtcN8BwBfh4MsO76IAvgidmAMBfBEOvuzw7gzgi7CAhe3w7gzoi3D0hZi2AX0RhtEiA/oiHH0hBhWgL8I4/eHmFuAX4fDLDh9UAL8Ih1+I4Qrwi3D4BV+oCYBfhMMv+EIG0BdhtglHH+AXYXaJKR7wF7HdJKZ4AGCEi2EhOjNAMMIhGKIxAIIRDsHgjQEIjHAEhmgMQGCEIzA7fFoDBEZs3fjDTRdgMMIxmA3RcvCY8JY+ewwYjHAMBj1ODQiMsJCF44cOBCAwwkIWjh86EIDACAtZqK8DBEZYyMLxEwoCEBhhIQvHTygIQGDEzp2/x0+hAwIjLGTh+AkFAQiM2Dn14VYAEBhhIQvHTygIQGCEhSwcP6EgAIGRjsDg87AEBEZu6N1aCQCMtIyFM9TrkgDASAdg8JlVAgIjHYHBJ0sJEIy0lIXj93BIgGCkpSwcP1QhAYKRG3eNAnFOHpwBd0Et+KEKCRCM3JADUAICIxl9tEsCACOHG0nwA/MAwEjLWHDeLgF/kRax4NE9EuAXaQkLGsElAXyRlq/gEVwSsBdp8QoewSUBepEWr+ARXBKgF2npCh7BJQF5kRau4BFcEoAX6SJb0C0KCbiLtGgFh+0SYBdpyQq+vSwBdZGWrOABURJQF2nRCj5/SIBdpCUrxL0MgLpIC1aImxkAdJEWrOB3MwDmIi1WIW5nAMhFWqqC7/RLQFykhSroDpAEvEW6yBY0JdCZ5Sko0ZIAtUhLU/ANTwlIi7QwBXd/JAAt0rIUnHBIwFmkRSn4TqMEmEW6sBb0y4DGLEfBA6IkYCzSYhR8z17Cu0wsRcG34SW8zUTSO+sS3mdiGQq+WS7hjSYWoeD733Jyp4mkp1h4q4lFKHgYh4T3mji8gkZmSHi1iQUoeLCFhJebuKM/uO2H15u4oz+4jgFakZae4MFTEpAVaeEJHjwlAViR7uwPLi/gKtKd/cHlBVhFurM/xBUz8DYad2YLn9kAVZGOquDBUxJQFemoCh48JQFVkQNVwa0koCrSnf/BD3pKQFWkBSccP+gpAVWRmrywTgKmIi02wZ0HQFSkhSaE8wCAirTMhHAeAE+Rmj5vLgFOkZo+by4BTZGaPm8uAU2RFpgQTh+AKdLBFMLpAzBFWl5COH2ApUgXyYJ7MIClyMTFKBKgFGnoO7okICnS0Ld0SQBSpKHv6ZKAo0hD39QlAUaRFpUQ3g7AKNKSEsLbARRFWlCCezuAoUiLSQhvByAU6WJY8OYFBEVaSIJ7O4CfSHdZCpoS6GxL7t9JwE6kxSOEtwPQibR0hPB2ADmRFo4Q3g4AJ9LCEcLbAeBEultT0C8DGrNohPB2ADaRlowQ3g6gJtKCEcLbAdBEWi5CeDuAmUiLRQhvByATuaOj/SQgJtJCEcLbAcBEWiZCeDuAl0gXsYJ7OwCXSHeRCu7tAFqiLBDBvR0FYImyQAT3dhSAJcryENzbUYCVKItDcG9HAVSi3E0qhLzgBjZ3kwohL7iFzd2kghoyBTiJcqEquLejACdRm8RFDgpwEuU4Ce7tKEBKFEtcA6AAKlEssVmuACpRLLHTowArUZaHcIZiPwVgibJEhDMU+ymAS5SLVcFDZhTgJcrFquAhJQoAE8XI88kK8BI1hKqggQMKABOVClVRgJgo7nxKlGoqgEyUQyYcVzZgJsoxE/zWDgWgiXLQBL+1QwFqonhip04BbKLcVa/4FR8KcBPFE3utCoAT5S585fglkACdKJ7Ya1WAnSh37St+eYgC8ESJxF6rAvhEudtf8ZtGFCAoSqRGIGAoyl0Ci19LogBEUSKlQUBRlLsKluPDFWAUJejjkwpgFGVhCXXhJtCfcHf24uMEkBQl3LW9KHdXAKUoi0s4fjeKAixFWV7CBW5gAExRwwEhXAxAU5RMRPspgFOUi1bBb4pRgKcomYgXUwCoKAdUiG4EiIpy8SpUyUCDMnEVjgJMRcmUDYW3xiqnQdzEwItjVSJeU8G7Yy064fjhcAWvj1UpDcIbZF28CmFiJrfIpjQIr5J116pQJQMNqpQG4Y2y7mIV/KSZgpfKqpQGAVlRjqzg1yMrQFaUTmkQsBWlnQZxxwTQFaVTGgR4RVmEwvFDIQrwFaVTGgSARVmIwvETJAoQFuXiVfCwEgUQi3IBK3hgrAKMRTnGggfGKsBYVCpgRQHIohIBKwpAFmVBCsePnChAWZQLWMFDRxXALCp1XkgBzqJcwAoewaoAaFEm5cYA0qIsTaEmK4BalMUpHD9TowBrURaocPxMjQK0RW3dDfa4EQW4RVmkwon7twFvUVunQdxsAOKiLFfh+OEXBaCLsmSF44dfFMAuyqIVjh9+UYC7KMtWOH74RQHwolzICn74RQHyolzICuHDA/SiLGAhrvsG8EW5oBWFdw1AX9SOPPOlAHxRLmQFP4CjAH1R7tAQdZk4UJ8LWVFozK0C/EW5kBWFdzkAYJQLWVG4HQAERrmQFYWvigGCUS5kBb8xXAEGo9yhITwQWgEIo13ICh4IrQGF0ZuEH6oBhtEuZoW4uxxwGG1ZCyeuLwcgRlvYwokbzAGJ0S5mhbjEHKAY7WJW8HvMNWAxejg2hF8iD1iMHo4NYTFxGqAY7VAMHhOnAYrR7iYW/ESEBihGu6tYNNqdNUAxmpEvgWgAYrQDMfjN6hqAGO1ADH65ugYgRjOnPvyufABitAMx+AlNDUCMtrQFfxgJgBjtQAz6YI4GHEZb1MLxAxwacBjtjgyh7+FogGG0OzGEvnOjAYXRjsKgL91oAGG0gzDoCzYaMBjtIlc0PkwBg9GOwRh8mAIGox2DQa2hBghGc1pzAMBontAc4C/aXcuCTE4awBdt+QrmR2pAXrQ7KIQrGIAX7cALrjTAXbQ7JoR3BoBdtHt+hygX6MxRF7wzAOii3RM8+BkhDaiLFoaeGzXALnrALigO0AC7aIddDD4pAeyiHXbBD9xogF20wy74qwUaYBctXbAYbgIBdtGWrHCDd3eAXbR0G7N4JwbYRUtFezcaYBctnQa32KQEqIuW5PVVGjAXPVzLgnIiDZiLtliFb9GFiAbMRTvmskW3PzRgLlox6hktDYiLdsQF3fvQALho5SL9OFouUJ1FKnyLawPwFq3cpjrqt2nAW7TjLfiJCg14i3b32G7xGRfwFj1cZEu8TgO0l+ItGr7j43gL/iCDhk/5pHiLhq/5ON6CO9MaPuijnQLxSQy+6eN4yw6fxOCzPloluufkZR9Ndk/4tI8FKkT3hI/76C3dPeHzPnqX6J6AtWizSXRPwFq05SlU9wSwRTvYQlhDAFu0C2kh2hjAFu1iWvCGA6xFDzEtaMMB1KJdTAsxjQDUoh1qoSQG6nOohWploD93OIhYgQDUoreJ+wU0QC3aoRZiUgWoRTvUQnwgQC3aoZYd7jUA1KIdakHHCAAt2oEW/AEVDUCL3ibOdmkAWrRlKWTDwbe13NkgfDkGQIveunvAcQcDkBbtSMsOdzAAadE7Mg5QA9KiHWnB0ZAGpEVbmILv+2sAWrQDLTuNdmUAWrQDLbgrAjiLdpxlhztEgLNo+pZbDSiLdpQFP16mAWXROzKkTAPGYjZOc+iEYwBjMRajCPydGgMYi7EYhXhSDCAWYykK8agYICzGQhTiWTEAWIxlKHg4kwF8xViEgoczGYBXjCUoYoOuRQzAK8YiFLHheGLwZppFKGIj8MRAeRahiA1qkA3gK8YiFJxDGoBXjLvqFj8NZwBgMe6uW/w0nAGAxTjAgvvfBgAWYxmK2KCDyQDAYixDERt0PWsAYDHMKRBdpBqAWIzFKAJf/RrAWIzFKILhXQMwFsPdpWR41wCQxViQIhjeNQBlMZakCPwcmgGYxViUIvCYbwM4i7EoReAx3wZwFuOOCOFRUAZwFuM4CzYxGIBZDE8NQABaDE9sMBhAWgzfJboRgC1GbMgpxwDcYlygCz7lGMBbjODklGMAbzEuzgWfcgwALkaQx/IM4C3GMhV0FjEAtxhB31xsAG0xgr652ADYYgR9c7EBrMUI+uZiA1CLkfTNxQaQFuPePibMNyAtxj1/TJhvQFqMewGZMN+AtBj3CDJhCwFpMe4dZMK8AdJi3FPIhHkDqMVYnkKZNwBbjNwmzBuALUbuEuYNwBajnOFE3SEDYItJBbgYgFuMwy040TKAtxjlDCfuPQHgYlSClRkAXIwDLvjDsYC3mIG3YKtDA3CLsURF4M+cGYBbjCUqAg+YNAC3GEtUBB4waQBuMTphOAFtMe7lIDxe0gDaYlK3sRhAW4wFKgKPlzSAthh3Gws6OwHWYgbWgnJDA1iL0ToxlQHaYrRJmAyAW4xOzXuAtxidmvfgi8pmkzAZ8FFlw2hdw4eVHW4hJkn4trLDLfgkCV9XdrSFmCThA8sWqeCTJHxh2QIVfJKcPLFM30Bt4CPLqVeW4TPLqXeWAWgxiZeWDeAsxr21jE+SALOYLU9MkgCzmK1ITJIAs5htat4DoMVsU/MeAC1mqxNTGQAtZmsSUxkALWa7TUxlALSYrbObKI40ALQYy1IER3GkAaDF7FLzHkAtxt2Ei0dmGIBajEMthMyAtRiLUwTH1wCAtRjLU8gPBBq0PEXgcdhmgC0/PT407af63NWHb9tD/fnhm3fvHn7+ufvyWj88/uPh58b9Y99MttSHb/7x0N+j/80//vn40N97P/wh/R/a/7Ed/tA+sfaJtU+sfWLtExuf2PjExife7dwf/YWx7g/G/B/C/+HTcJ/GyyO8PMLLI7w8wsvTH1IZ/hjK6Q8nDH9o/8dQTh+pP/zhcwmfWAr/h/J/GP+HL1kx/4dPrHxi5RMrn1j7xNon1j6xb58+TND+oX0u7XMZX5fxn9x372/+8c9/Pvr+YP+v7x/V+0t3rvbd6+l0DDsAVzf9i7nMv5zOH+tzlH0X5O+RJ1HAvms+xR1P87Bi3/hMJ0to2q4+f6riL9iZUIShtfoVoPvDNSRW5OHQVZePT9d23zWnNixT725FmkG2/jU912O58WNh0Eh/04L7Y+cVsfHVC+Pl2NJyuIbdfzg1+7pv6q5+/hJ9Iwtaq7+pZ6ak9nSIW5uzW35G6/mpq899m9Sf6/21b5QPp9PHsKBt0Na74cv65+pce/hvleMgcM1AVXUT9lJ319ewot02EHjjVbD19mRscG+gFN0oz8/n+rnq4gYJ+21/6d4w+gxVyOVLuz/Xl9P1vI8K6jctb71Pk5/7qWqO1ftj/Vqdq+OxPjaXl7gTy6CY7Y4spj5Xz/GXqEAl/c3fgzH1ZpF5Q8n9T97kCW+UlaHG7ftq//H1XF8u1zOoNOhP/U3trpwd9fnv66fTuU73rGAi8oO4fzRx6Fna69vL7L4Ureu5afuqXuvz0+n8UrWxxno6eBvcnCzmuv9Yd5dISTrolJpRShpyNn+PO4oOzRRTZObmaM3S5W/X+lqfXvu2iqQI9a3pYi6RAdEi/Oahdf3k1T9R51rXT7jS0M1y+RIM26hTyNCXIOeCfdW2p+7S1dWx/86ohE1ophhlpvbVa7Vvui/xfBLkHD5Hc8om7D/U+4/TSakH9Le2lcMQ6vl8qpj2UL803eFLW700+8GSn+uqV1z9qW7jPtRfVXET1M8kzDsU/YuFgyoGEyo11c/C2uuX1+6LrS02+zw0+5ROw4LOdXVACgrnH0aOmbCgaLBj7aDCEql+DEvsB0XTPmPlhR0grfiX+nKpnmunquYQDa6gA/rZ3dAd0ZbWtM3L9aW9vryvz6cnV2okmwwn76Q2e+8MGfIyGL2KHFe+AOjjy+CbJOWE2NzQZsVaH3posmlDhyr6hH779GaBNskW/VQdG9QlwpomMOYqWaorECmi3wYORKPb93S6xM0Tzv1C0ZrtM+KOWVjCjiygOe+vx+r8/vr0FLvfQZuSYh/rKnbZg0x+OaW9c6AFaev6cm4TU1SiCJWgSOtwvF66+kz08f6Z3ltnIz2JoZDpSkSEhtXQBuXU7q/nc93u4+nDBFN7fx07mfvSna/77hTVHc5a3qB7Z8v//zCzMu8sia1fPGz8H35dp/1Y0zu/wPM+m9Gkfvopp67ag3Wlo9kIdrrQ12R+wukfhx58LS/PuILdkK0ZVUrUFurVL4v6Z6uH2ra+Nr/c3qQ/kVrhbMKpjhoNh6qr4q4buixDq/vVi/YcQ28pkQ71U3U9dtiarX8d61b2lhoVQwmzK8BNuF4ml/mH+lh3dWiFXcHXC1g29OdVb2OW7FWHejLaWWCyPEbpTzsM9oMauENJx+rSvZ6b07npmr/XB+gB8tAKKHKuGwqb+I88XDX6nqXISe9Qn+vn5mZPBsfg2P9TG5uXEDIw7y+zEY/5dZdk42CmlpKHXr+nSLnbwID4Ic+2fsIVI4MbTIf0jrskp4yhkqZ9jmxk0LiSblublZivghJ241gWXtJRQN/05Gx6aC77U9vW+8jP7C/EuKmf5BSDdYs5VuS5kdW6nMFUFM9BocMjySHrCuk+9M7yBKiFy0u5IbteaKCt0x2PsXBRTxKsqJDJEO/v6w8KoQZmfbzGC6nAbPWPXA2swPMEvyTXftrqA1WHP6gub713AA7DD/RTkBoXpEPZ3Hck6R0USTaGXQKFVYT+gC936JZDP2UjqPYAUgq/7PKdWnNqjNVtD3SQpYgJTbUgG8VmH2whcEZCT8j7BFsvD9WlXIG4i6ZCTOvH7Qjl+QjlPXkfZ+VxSNPKbQ9J2qJCt4zshO10ngls+eieeg1q0jYMJU2nhrBRxYjtKU+vbj/FKgl5ofSzHWne6vM5dhFFuBQ35FrB5vtQtYdjPFz6u7qCPuXxKrkytb0SKYeHfUsxUh199uPp9HrtmmPzd8syXuqqx4B9uktXdc2la/bxOirUmCKhiYMCkapD59u7ocx4G+C/lsvRY/aDVHpasiP16GqLFvk8Wk9vSR0OWe2Iij27oBE56YsN+XGevwknCWqiGUqY9uWQdYj0pwMXgEcL5m1a9qZ9Rj4+HJc7WvQG638spKBi3GFjlE17qpojVN4u/ADq413GqfQqcvgpm/bU9KS++xCN4OC75TiB+L45klO/UpPkfs9T87k+kB5IuDbbUWPIFuGnjqnlDFdc1BCfFgF9vdBikZOOLYbyhIJuKjU1zJ6O1fPN2awu7amb+kM8bJbRX9iNlsG3/rjFuqEs7NPxevmAT5L97YmB+7fxtfjZcbQ2atyupD8qqgWQjpAXSGoIPl2PUXOGNtJ3uocBUHqT6SX16zI57sh52qDJpfFzHSPfsC28o+B9IhIlP9fdS9W0CJ7ZhO4YG8aP8U1qyBX2c929no7NHqyGQzNCDuPnupsuhek1dui3kZYRLRNZXofzrE40162ToK5guNpmpCvqyxnn5XP9t2szTNZxw4Wca0eN6ucaAxJN3I9DlyilvoGzt0+n+MvCtbqPvmA739Wkd/h9pIci11JjHb0B+Vh/ef8FRfuBdkljFBUV6hlTjgmM0pays2SJs70xsOIkPXJT7NTbDEev8UsHIz1FJDd8XXkfm+NxYCHxGA53Tr1RMN74GhJ5DI5Ab9XRYgN7aDxbMX5vzGhqjnfFTjcRw0U8S7dctEt1ri+vpxYw/nA5zzjVzW+lefWeXuvz4DcjXxxux/rFrvFd3pCdyVVz60/h/vx0024T2g5yuxqW2RyOWFnh8omlFR1ADbxJQ/+EXBJ+qC5k+EEYtcTEGF9Fa+dCRvoEVsiMSw9P3PgY9ebn0RGOj2jeoz8jxtFFNk9dxb6sDpflpKv2obl0p3M8AYZwWZG79bEF5CEjV957UD6oRo/BS94aG02Z3L6TxH59MIbFLd6O2jhooi4HFhhBo3AyFAbOJzIih94994r0UTDcm0Dpab/c+nYgSU3TNp0dEQjHCoUld776Am5fO3EWdqHBIheDNvatrY6T0I7QKI9oxyNZv8MnR6JDstFmuhgJNSFJXV56ly9yVYN8fr+L+dU7243RJt5L1eN+l7f53sU3hq41MIOwSULmRBmFPmgi3koOVit0nnMFNv/C0Do+Rp6MnjIpPxJMGTp7ipN6mvMc+neVg31pskPhiJ+HmyiKlL/3EeJsoccrxu+nLEif/339ofrUQFAWKs8vWwy5IRyWE0cchN9hSEDU50dAhQgZi/FeqdlRzdHva/VzTNe81JeueomCGXlI4vXO920Ptgxpv/udqCik4vXc+xUd9MSDLuhpPPOzGfeWjnvwK0ffehTFx14bP78ZEovh6zseBmxqcmHxUr1i/C/o99sx1nNcdI7B6CP280aNXPm9VJ+r87n60hw+R2uAoIvSOftwnhgahfDVw0fhPVXhV7NinFLJmK2h9FSwUEgGvUPiNcd9VdJP0TKhp89N62Lc+k4Zd+5wMU5Sppfqs12YAv4WTrSkpzrmRRBcuC+eqnwSjhRyW+6jjjUZMx4Q63hfLNyf0WM8BrXiD4rB4lbC+AZBrlVCeh5nD2OISJw5D99FOHdkiTELC1gYKCJIX/ClPjRVG6s4pAw+5kP4hY7wAZrCT5PCT5xC+z881FKG1stkYdVfYnOzQnTndDn3H6q2reNZLGRzitwjHwpAAXe4UTSeJSF3XxMhByJcyJrNuIj3swYJBYYyP1VHEKcVzhOa3DcYAhpjhYZftfGbwhsfSX4Ld/IfTPeW2XDJEJ15PsjG00Z+bSFHz5Zcbr007dSERFCbMj42RdhyYYSG9jHo2tsO7d1t7SddTSqnrT/HIQ8mMIeajFuzbLyf0WK1BAsHSp3xepeHVF+Ri+8T2MblYaCUIqU8tcemxYdFaEq8R6JI7/70Gpui0Lr5JRwbD56NCwlvRqTfPNT+dJnxlMAYqqEm+xebcNonHcg+25SXhJ2Yk5855o3t7jacoMggqD7zhKqGu1Q8+anYXBYeExDkng8WZMxMFNBB9SufFXxvWC0Zxft6OscjZxuOHL+8NOSZCAzhhvtK3lhrH4mo/WSkPRAyaq7waXBs2PM1uWGf3okLz6NpEkK+nk8vzaX2zO2lihch4ZzsF+XjaU5Pc6WfkiXdaeNqfjlXr69gMRAe5tGKss+v10ifYSg0kQNzR0OfnrS6lC8abiZzco3Zo0ywkginkUSuqLOFYQNqnNj8yQ/vFHEPpKTvkNKHAioPHbWk2vR2fsPBqqixQp5DRred60Nz6c7N+2tXU80W8mtGcksfXNlPJm6eJ8NSwmPIitydmRaYitgMgyS8p8I8GuRjDMkY+kU6zXGQKP0NYU9UlPHMjzgNJ/fNOGD9nOedMOn7jSQN37n+K4yz3Iar9UR7v5zAsd1dGB3oox8keczTlUDB99D18TM28+eduV/i8rEa7/pKH3pqNiNL8e6xoWyHE2X+pG0UI0sPs1th01D0KP6CbpoL2HEPD9cKcqax+eyQ7Idn2zXV8fjl0p2OdXtb0lEhoaFLw0iXsT/oegRH47bRsUO6d1+66jzA7lM72Zhk4RJEkEuQc92dAePim3AJQnK4Ief+dI0dMh5uMgqSgZ+vUQftr8kIdjzHjTqPqcn1+vna2iPDcWHRIUy/jBsdly3ZqNd2Wla4NuTjVqwfBWS05vnaQhrUX7oaTII+0NePQ+FnH70Z3aEx9Jf6/kvdHoJd5O40JYahk0uGkfXl2B51fU0UFTIU5ikD87iQ+TWA9LtAkjzvMNQ3jKJElSw8z8bIOKDLEB072RXGygxjPEnva7bEaNSE4XbkagAWGVDm7kSF84Rn5vwUZDyYNduk+GShIbH3yjJ89Owp0+4KRfpFGGjlJ3ymxsAuP/OPVJU8vz+1tbETGnp2JFW41N1w2oecEIMe4Pkm86H33PuD3PuMcox787tsxjs6xoevGZJr3sSZP3wUQkry0MmlxgFpaHnHPQjylNcljInCzr+HawvvRXtayP3yhXskI8erA0j7epmPwgoH+8i4SBc6KhAiKBW5XjMl2GPyTft8aqlYiHDjPTFAhvgwV1okTri0pGaNPn/TPoNjDiEeSbXF9XVy2UMw4/g9KCbHGDCvsfFSHfK88AUNVIuUF0b8ek+SjRcT8XFMjREevuMkbBhaKdZXw7W/Pwrqbxvh3gXg/l+k3/aW9MT6oToe3UHI6PRPZPai0E1v7TxK5Z7Hy3HNT8JaWxsRhR4Cn7S419dDlXUoMVyVkFuIcDyF5mD4VO/CyHGLaNyXJ3t472TEaCBoxKEcvw3M/BKd+87C1bi36jsv/QF9VcQNFCL0cg0ZvGaLAGv70Mr63k1uDtoC4OnA6ITpTMYMjB/GU5Djty9uvqyQ9JERQbYsdP89pAskmgwWLgCKhuCMXM4R23Lh0Rbt+4Yep2u/t23IDaK+3CsIbAgXJeRSDDP2PAyCVbTXPWQlI7TCBQM9rSJ+UhhaQttXmxHZOA6hG8njL93plRxdoYdNcivUBQqXK9qPdu3nEe0vBzOKlsuVOj2CHkbliXFrhLZUrpxpVDwL466El1GQ0SW+JGS1zcJLQzi5kdovS+cDxXm4ipbkZQJd1cT7L+F6SJPnySZHyMPpT5MrvT6bXaJjfrgIg9MNuQNDufE8nBv1eMbBsztDBqpGC7v3kNqJMD7MKEop6OowFi90S0jbjJZzri/XYyxVGFVqSNiPljY1bjw8VaBJrzIOzcdioriJ1gnjBm1OieDmmmBQeT9iBJB+TWb8BrUh4xUyArl46Kwq7xlrMvSyLxLE+IY2QPuzEzopFHF0l4cnELRfT2oSI0wMNtfRkYtkvqembS4f6kM/f5+ugIuGrg15gdJtxRUulSbXsIVejrod5E21z1Aqfq1btJwjg3eTK1oWNrTwM4CQKStBL1Z5tKIjyTy9QGU8xGnjhJQWZ36hykInTpB3csTnmGLvIVQdyfnzDkKxcItS+N04QWI3avnMwthFQW7L2ezUZBPuFxhN9sT6/NK04B5LzqP48/ESWnKsfXB7mXEZYcwTebnb7ZAndodWGIoiyePtrgyE/IX78IakcHhwbQgTtBpDckZ7Rfa00zSgJrp/kMp3rtrLU33uN+1iQUJ76buUJqHM5J62MIJvvBjQ74b5HUBuRmo5XonhgRS5NLq25/op1nl4DJxcFV/bBSAqilabLRAZS+HNIySScDAhHspRZIPnOOTdDK6EZMC2CI8uGzLg4gY2Vu3FhRu85EmZoI7cckNyQbrN0yOrodlXZNx+cCNE1Hmj66SGzuuZGvc7Z9xf+yVuJ5R9L/YXyyjydNmn+nwB1bIwMIyTa6ZPzbm7uvtG+60C1IyEKx5FGo1fqqabbqCFc8BmnEt8KOt4lQx5gvWXunn+AINvw15NrpWntjQMr/bhPcybRe73B7jfw5OegMox4pbcls1Y6oXbYsLf5SFI0oCXuD+1HQyTDJt4DObw3Wq8Md6fHpBj/yLdVbxq7Kx56J2RMUJ4cbmnssMwNDIkfvbcTxgmJsTYD6lZIRNiszBMQ/jQMUGyxSFMBm798/B4vRbjFjI1zWJnuHkYh6z8PoEmT+7hR895PETSmRMROixyFzzNZ/7MEh/DVcYXAMh4khtps+FF/UlxAEPCrQRFhj9E5+Dj/GGElT9np8mbCW4FYd5eeAe1IkE3gQ95dJWRH8qjnzNe8T7Gw/kZ3bewJGFpUCN+v3R45wB56Qx5UywLwYnwK2I1xhjPmDliWRMeR9Ezhh76jDzymcg91VtmoIlobyw9oKcOQ7T1SGK9X85N119MFn9zWDFJkPusNQi8DI0xlu2nx4fX5rXu49Afvnn30z//+f8BxakK54qfAgA="; \ No newline at end of file +window.searchData = "data:application/octet-stream;base64,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"; \ No newline at end of file diff --git a/docs/assets/style.css b/docs/assets/style.css index 778b9492..9d619a64 100644 --- a/docs/assets/style.css +++ b/docs/assets/style.css @@ -10,6 +10,7 @@ --light-color-text: #222; --light-color-text-aside: #6e6e6e; --light-color-link: #1f70c2; + --light-color-focus-outline: #3584e4; --light-color-ts-keyword: #056bd6; --light-color-ts-project: #b111c9; @@ -35,6 +36,7 @@ --light-color-ts-set-signature: var(--light-color-ts-accessor); --light-color-ts-type-alias: #d51270; /* reference not included as links will be colored with the kind that it points to */ + --light-color-document: #000000; --light-external-icon: url("data:image/svg+xml;utf8,"); --light-color-scheme: light; @@ -50,6 +52,7 @@ --dark-color-text: #f5f5f5; --dark-color-text-aside: #dddddd; --dark-color-link: #00aff4; + --dark-color-focus-outline: #4c97f2; --dark-color-ts-keyword: #3399ff; --dark-color-ts-project: #e358ff; @@ -75,6 +78,7 @@ --dark-color-ts-set-signature: var(--dark-color-ts-accessor); --dark-color-ts-type-alias: #ff6492; /* reference not included as links will be colored with the kind that it points to */ + --dark-color-document: #ffffff; --dark-external-icon: url("data:image/svg+xml;utf8,"); --dark-color-scheme: dark; @@ -92,6 +96,7 @@ --color-text: var(--light-color-text); --color-text-aside: var(--light-color-text-aside); --color-link: var(--light-color-link); + --color-focus-outline: var(--light-color-focus-outline); --color-ts-keyword: var(--light-color-ts-keyword); --color-ts-module: var(--light-color-ts-module); @@ -116,6 +121,7 @@ --color-ts-get-signature: var(--light-color-ts-get-signature); --color-ts-set-signature: var(--light-color-ts-set-signature); --color-ts-type-alias: var(--light-color-ts-type-alias); + --color-document: var(--light-color-document); --external-icon: var(--light-external-icon); --color-scheme: var(--light-color-scheme); @@ -134,6 +140,7 @@ --color-text: var(--dark-color-text); --color-text-aside: var(--dark-color-text-aside); --color-link: var(--dark-color-link); + --color-focus-outline: var(--dark-color-focus-outline); --color-ts-keyword: var(--dark-color-ts-keyword); --color-ts-module: var(--dark-color-ts-module); @@ -158,6 +165,7 @@ --color-ts-get-signature: var(--dark-color-ts-get-signature); --color-ts-set-signature: var(--dark-color-ts-set-signature); --color-ts-type-alias: var(--dark-color-ts-type-alias); + --color-document: var(--dark-color-document); --external-icon: var(--dark-external-icon); --color-scheme: var(--dark-color-scheme); @@ -183,6 +191,7 @@ body { --color-text: var(--light-color-text); --color-text-aside: var(--light-color-text-aside); --color-link: var(--light-color-link); + --color-focus-outline: var(--light-color-focus-outline); --color-ts-keyword: var(--light-color-ts-keyword); --color-ts-module: var(--light-color-ts-module); @@ -207,6 +216,7 @@ body { --color-ts-get-signature: var(--light-color-ts-get-signature); --color-ts-set-signature: var(--light-color-ts-set-signature); --color-ts-type-alias: var(--light-color-ts-type-alias); + --color-document: var(--light-color-document); --external-icon: var(--light-external-icon); --color-scheme: var(--light-color-scheme); @@ -223,6 +233,7 @@ body { --color-text: var(--dark-color-text); --color-text-aside: var(--dark-color-text-aside); --color-link: var(--dark-color-link); + --color-focus-outline: var(--dark-color-focus-outline); --color-ts-keyword: var(--dark-color-ts-keyword); --color-ts-module: var(--dark-color-ts-module); @@ -247,11 +258,17 @@ body { --color-ts-get-signature: var(--dark-color-ts-get-signature); --color-ts-set-signature: var(--dark-color-ts-set-signature); --color-ts-type-alias: var(--dark-color-ts-type-alias); + --color-document: var(--dark-color-document); --external-icon: var(--dark-external-icon); --color-scheme: var(--dark-color-scheme); } +*:focus-visible, +.tsd-accordion-summary:focus-visible svg { + outline: 2px solid var(--color-focus-outline); +} + .always-visible, .always-visible .tsd-signatures { display: inherit !important; @@ -266,16 +283,6 @@ h6 { line-height: 1.2; } -h1 > a:not(.link), -h2 > a:not(.link), -h3 > a:not(.link), -h4 > a:not(.link), -h5 > a:not(.link), -h6 > a:not(.link) { - text-decoration: none; - color: var(--color-text); -} - h1 { font-size: 1.875rem; margin: 0.67rem 0; @@ -306,10 +313,6 @@ h6 { margin: 2.33rem 0; } -.uppercase { - text-transform: uppercase; -} - dl, menu, ol, @@ -333,7 +336,7 @@ footer { padding-bottom: 1rem; max-height: 3.5rem; } -.tsd-generator { +footer > p { margin: 0 1em; } @@ -421,6 +424,9 @@ a.external[target="_blank"] { background-repeat: no-repeat; padding-right: 13px; } +a.tsd-anchor-link { + color: var(--color-text); +} code, pre { @@ -580,13 +586,13 @@ dl.tsd-comment-tag-group p { } .tsd-filter-input { display: flex; - width: fit-content; width: -moz-fit-content; + width: fit-content; align-items: center; - user-select: none; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; + user-select: none; cursor: pointer; } .tsd-filter-input input[type="checkbox"] { @@ -609,11 +615,8 @@ dl.tsd-comment-tag-group p { Don't remove unless you know what you're doing. */ opacity: 0.99; } -.tsd-filter-input input[type="checkbox"]:focus + svg { - transform: scale(0.95); -} -.tsd-filter-input input[type="checkbox"]:focus:not(:focus-visible) + svg { - transform: scale(1); +.tsd-filter-input input[type="checkbox"]:focus-visible + svg { + outline: 2px solid var(--color-focus-outline); } .tsd-checkbox-background { fill: var(--color-accent); @@ -630,13 +633,18 @@ input[type="checkbox"]:checked ~ svg .tsd-checkbox-checkmark { stroke: var(--color-accent); } -.tsd-theme-toggle { - padding-top: 0.75rem; +.settings-label { + font-weight: bold; + text-transform: uppercase; + display: inline-block; } -.tsd-theme-toggle > h4 { - display: inline; - vertical-align: middle; - margin-right: 0.75rem; + +.tsd-filter-visibility .settings-label { + margin: 0.75rem 0 0.5rem 0; +} + +.tsd-theme-toggle .settings-label { + margin: 0.75rem 0.75rem 0 0; } .tsd-hierarchy { @@ -769,6 +777,9 @@ input[type="checkbox"]:checked ~ svg .tsd-checkbox-checkmark { padding: 0; max-width: 100%; } +.tsd-navigation .tsd-nav-link { + display: none; +} .tsd-nested-navigation { margin-left: 3rem; } @@ -782,6 +793,15 @@ input[type="checkbox"]:checked ~ svg .tsd-checkbox-checkmark { margin-left: -1.5rem; } +.tsd-page-navigation-section { + margin-left: 10px; +} +.tsd-page-navigation-section > summary { + padding: 0.25rem; +} +.tsd-page-navigation-section > div { + margin-left: 20px; +} .tsd-page-navigation ul { padding-left: 1.75rem; } @@ -812,10 +832,10 @@ a.tsd-index-link { } .tsd-accordion-summary, .tsd-accordion-summary a { - user-select: none; -moz-user-select: none; -webkit-user-select: none; -ms-user-select: none; + user-select: none; cursor: pointer; } @@ -828,8 +848,9 @@ a.tsd-index-link { padding-top: 0; padding-bottom: 0; } -.tsd-index-accordion .tsd-accordion-summary > svg { +.tsd-accordion .tsd-accordion-summary > svg { margin-left: 0.25rem; + vertical-align: text-top; } .tsd-index-content > :not(:first-child) { margin-top: 0.75rem; @@ -877,7 +898,7 @@ a.tsd-index-link { } .tsd-panel-group { - margin: 4rem 0; + margin: 2rem 0; } .tsd-panel-group.tsd-index-group { margin: 2rem 0; @@ -885,6 +906,9 @@ a.tsd-index-link { .tsd-panel-group.tsd-index-group details { margin: 2rem 0; } +.tsd-panel-group > .tsd-accordion-summary { + margin-bottom: 1rem; +} #tsd-search { transition: background-color 0.2s; @@ -1034,6 +1058,12 @@ a.tsd-index-link { border-width: 1px 0; transition: background-color 0.1s; } +.tsd-signatures .tsd-index-signature:not(:last-child) { + margin-bottom: 1em; +} +.tsd-signatures .tsd-index-signature .tsd-signature { + border-width: 1px; +} .tsd-description .tsd-signatures .tsd-signature { border-width: 1px; } @@ -1347,6 +1377,12 @@ img { .has-menu .tsd-navigation { max-height: 100%; } + #tsd-toolbar-links { + display: none; + } + .tsd-navigation .tsd-nav-link { + display: flex; + } } /* one sidebar */ diff --git a/docs/classes/AbstractPool.html b/docs/classes/AbstractPool.html index 23d24db2..02a98fd6 100644 --- a/docs/classes/AbstractPool.html +++ b/docs/classes/AbstractPool.html @@ -1,260 +1,159 @@ -AbstractPool | poolifier - v4.0.15

Class AbstractPool<Worker, Data, Response>Abstract

Base class that implements some shared logic for all poolifier pools.

+AbstractPool | poolifier - v4.0.15

Class AbstractPool<Worker, Data, Response>Abstract

Base class that implements some shared logic for all poolifier pools.

Type Parameters

  • Worker extends IWorker

    Type of worker which manages this pool.

  • Data = unknown

    Type of data sent to the worker. This can only be structured-cloneable data.

  • Response = unknown

    Type of execution response. This can only be structured-cloneable data.

    -

Hierarchy (view full)

Implements

Constructors

Properties

Hierarchy (view full)

Implements

Constructors

Properties

Accessors

Methods

addTaskFunction -addWorkerNode afterTaskExecutionHook afterWorkerNodeSetup beforeTaskExecutionHook -buildTasksQueueOptions -cannotStealTask checkAndEmitDynamicWorkerCreationEvents -checkAndEmitEmptyEvent -checkAndEmitReadyEvent -checkAndEmitTaskExecutionEvents -checkAndEmitTaskQueuingEvents -checkMessageWorkerId -checkMinimumNumberOfWorkers -checkPoolOptions -checkPoolType -checkValidWorkerChoiceStrategyOptions -chooseWorkerNode createAndSetupDynamicWorkerNode createAndSetupWorkerNode -createWorkerNode -dequeueTask deregisterWorkerMessageListener destroy destroyWorkerNode enableTasksQueue -enqueueTask execute -executeTask flagWorkerNodeAsNotReady flushTasksQueue -flushTasksQueues -getTaskFunctionWorkerChoiceStrategy -getTasksQueuePriority -getWorkerChoiceStrategies getWorkerInfo -getWorkerNodeKeyByWorkerId -getWorkerNodeTaskFunctionPriority -getWorkerNodeTaskFunctionWorkerChoiceStrategy -handleTask -handleTaskExecutionResponse -handleWorkerNodeBackPressureEvent -handleWorkerNodeIdleEvent -handleWorkerReadyResponse -hasBackPressure hasTaskFunction -initEventEmitter -initWorkerNodeUsage internalBusy isMain -isWorkerNodeBusy listTaskFunctionsProperties mapExecute -redistributeQueuedTasks registerOnceWorkerMessageListener registerWorkerMessageListener removeTaskFunction -removeWorkerNode -resetTaskSequentiallyStolenStatisticsWorkerUsage -sendKillMessageToWorker sendStartupMessageToWorker -sendStatisticsMessageToWorker -sendTaskFunctionOperationToWorker -sendTaskFunctionOperationToWorkers sendToWorker setDefaultTaskFunction -setTaskStealing setTasksQueueOptions -setTasksQueuePriority -setTasksQueueSize -setTasksStealingOnBackPressure setWorkerChoiceStrategy setWorkerChoiceStrategyOptions setupHook shallCreateDynamicWorker -shallExecuteTask -shallUpdateTaskFunctionWorkerUsage start -startMinimumNumberOfWorkers -tasksQueueSize -unsetTaskStealing -unsetTasksStealingOnBackPressure -updateTaskSequentiallyStolenStatisticsWorkerUsage -updateTaskStolenStatisticsWorkerUsage workerMessageListener -workerNodeStealTask -

Constructors

Constructors

Properties

destroying: boolean

Whether the pool is destroying or not.

-
emitter?: EventEmitterAsyncResource

Pool event emitter integrated with async resource. +

  • OptionalmaximumNumberOfWorkers: number

    Maximum number of workers that this pool manages.

    +
  • Returns AbstractPool<Worker, Data, Response>

    Properties

    emitter?: EventEmitterAsyncResource

    Pool event emitter integrated with async resource. The async tracking tooling identifier is poolifier:<PoolType>-<WorkerType>-pool.

    Events that can currently be listened to:

      -
    • 'ready': Emitted when the number of workers created in the pool has reached the minimum size expected and are ready. If the pool is dynamic with a minimum number of workers is set to zero, this event is emitted when at least one dynamic worker is ready.
    • -
    • 'busy': Emitted when the number of workers created in the pool has reached the maximum size expected and are executing concurrently their tasks quota.
    • -
    • 'full': Emitted when the pool is dynamic and the number of workers created has reached the maximum size expected.
    • -
    • 'empty': Emitted when the pool is dynamic with a minimum number of workers set to zero and the number of workers has reached the minimum size expected.
    • -
    • 'destroy': Emitted when the pool is destroyed.
    • -
    • 'error': Emitted when an uncaught error occurs.
    • -
    • 'taskError': Emitted when an error occurs while executing a task.
    • -
    • 'backPressure': Emitted when all worker nodes have back pressure (i.e. their tasks queue is full: queue size >= maximum queue size).
    • +
    • 'ready': Emitted when the number of workers created in the pool has reached the minimum size expected and are ready. If the pool is dynamic with a minimum number of workers is set to zero, this event is emitted when at least one dynamic worker is ready.
    • +
    • 'busy': Emitted when the number of workers created in the pool has reached the maximum size expected and are executing concurrently their tasks quota.
    • +
    • 'full': Emitted when the pool is dynamic and the number of workers created has reached the maximum size expected.
    • +
    • 'empty': Emitted when the pool is dynamic with a minimum number of workers set to zero and the number of workers has reached the minimum size expected.
    • +
    • 'destroy': Emitted when the pool is destroyed.
    • +
    • 'error': Emitted when an uncaught error occurs.
    • +
    • 'taskError': Emitted when an error occurs while executing a task.
    • +
    • 'backPressure': Emitted when all worker nodes have back pressure (i.e. their tasks queue is full: queue size >= maximum queue size).
    -
    filePath: string

    Path to the worker file.

    -
    maximumNumberOfWorkers?: number

    Maximum number of workers that this pool manages.

    -
    minimumNumberOfWorkers: number

    Minimum number of workers that this pool manages.

    -

    Options for the pool.

    -
    promiseResponseMap: Map<`${string}-${string}-${string}-${string}-${string}`, PromiseResponseWrapper<Response>> = ...

    The task execution response promise map:

    +
    filePath: string

    Path to the worker file.

    +
    maximumNumberOfWorkers?: number

    Maximum number of workers that this pool manages.

    +
    minimumNumberOfWorkers: number

    Minimum number of workers that this pool manages.

    +

    Options for the pool.

    +
    promiseResponseMap: Map<`${string}-${string}-${string}-${string}-${string}`, PromiseResponseWrapper<Response>> = ...

    The task execution response promise map:

    • key: The message id of each submitted task.
    • -
    • value: An object that contains task's worker node key, execution response promise resolve and reject callbacks, async resource.
    • +
    • value: An object that contains task's worker node key, execution response promise resolve and reject callbacks, async resource.

    When we receive a message from the worker, we get a map entry with the promise resolve/reject bound to the message id.

    -
    readyEventEmitted: boolean

    Whether the pool ready event has been emitted or not.

    -
    startTimestamp?: number

    The start timestamp of the pool.

    -
    started: boolean

    Whether the pool is started or not.

    -
    starting: boolean

    Whether the pool is starting or not.

    -
    startingMinimumNumberOfWorkers: boolean

    Whether the minimum number of workers is starting or not.

    -
    taskFunctions: Map<string, TaskFunctionObject<Data, Response>>

    The task functions added at runtime map:

    -
      -
    • key: The task function name.
    • -
    • value: The task function object.
    • -
    -
    workerChoiceStrategiesContext?: WorkerChoiceStrategiesContext<Worker, Data, Response>

    Worker choice strategies context referencing worker choice algorithms implementation.

    -
    workerNodes: IWorkerNode<Worker, Data>[] = []

    Pool worker nodes.

    -

    Accessors

    workerChoiceStrategiesContext?: WorkerChoiceStrategiesContext<Worker, Data, Response>

    Worker choice strategies context referencing worker choice algorithms implementation.

    +
    workerNodes: IWorkerNode<Worker, Data>[] = []

    Pool worker nodes.

    +

    Accessors

    • get type(): "fixed" | "dynamic"
    • The pool type.

      -

      If it is 'dynamic', it provides the max property.

      -

      Returns "fixed" | "dynamic"

    Methods

    • get type(): "fixed" | "dynamic"
    • The pool type.

      +

      If it is 'dynamic', it provides the max property.

      +

      Returns "fixed" | "dynamic"

    Methods

    • Hook executed after the worker task execution. Can be overridden.

      Parameters

      • workerNodeKey: number

        The worker node key.

      • message: MessageValue<Response, unknown>

        The received message.

        -

      Returns void

    • Method hooked up after a worker node has been newly created. +

    Returns void

    • Method hooked up after a worker node has been newly created. Can be overridden.

      Parameters

      • workerNodeKey: number

        The newly created worker node key.

        -

      Returns void

    • Hook executed before the worker task execution. +

    Returns void

    • Hook executed before the worker task execution. Can be overridden.

      Parameters

      • workerNodeKey: number

        The worker node key.

      • task: Task<Data>

        The task to execute.

        -

      Returns void

    • Parameters

      • minimumNumberOfWorkers: undefined | number

      Returns void

    • Chooses a worker node for the next task.

      -

      Parameters

      • Optional name: string

        The task function name.

        -

      Returns number

      The chosen worker node key.

      -
    • Creates a new, completely set up dynamic worker node.

      +

    Returns void

    • Creates a new, completely set up dynamic worker node.

      Returns number

      New, completely set up dynamic worker node key.

      -
    • Creates a new, completely set up worker node.

      Returns number

      New, completely set up worker node key.

      -
    • Deregisters a listener callback on the worker given its worker node key.

      Type Parameters

      • Message

      Parameters

      • workerNodeKey: number

        The worker node key.

        -
      • listener: ((message) => void)

        The message listener callback.

        -

      Returns void

    • Terminates the worker node given its worker node key.

      +
    • listener: ((message: MessageValue<Message, unknown>) => void)

      The message listener callback.

      +

    Returns void

    • Terminates the worker node given its worker node key.

      Parameters

      • workerNodeKey: number

        The worker node key.

        -

      Returns Promise<void>

    • Executes the given task on the worker given its worker node key.

      -

      Parameters

      • workerNodeKey: number

        The worker node key.

        -
      • task: Task<Data>

        The task to execute.

        -

      Returns void

    • Gets task function worker choice strategy, if any.

      -

      Parameters

      • Optional name: string

        The task function name.

        -

      Returns undefined | "ROUND_ROBIN" | "LEAST_USED" | "LEAST_BUSY" | "LEAST_ELU" | "FAIR_SHARE" | "WEIGHTED_ROUND_ROBIN" | "INTERLEAVED_WEIGHTED_ROUND_ROBIN"

      The task function worker choice strategy if the task function worker choice strategy is defined, undefined otherwise.

      -
    • Gets the worker choice strategies registered in this pool.

      -

      Returns Set<"ROUND_ROBIN" | "LEAST_USED" | "LEAST_BUSY" | "LEAST_ELU" | "FAIR_SHARE" | "WEIGHTED_ROUND_ROBIN" | "INTERLEAVED_WEIGHTED_ROUND_ROBIN">

      The worker choice strategies.

      -
    • Gets the worker information given its worker node key.

      +

    Returns Promise<void>

    • Parameters

      • Optionaldata: Data

        The optional task input data for the specified task function. This can only be structured-cloneable data.

        +
      • Optionalname: string

        The optional name of the task function to execute. If not specified, the default task function will be executed.

        +
      • OptionaltransferList: readonly TransferListItem[]

        An optional array of transferable objects to transfer ownership of. Ownership of the transferred objects is given to the chosen pool's worker_threads worker and they should not be used in the main thread afterwards.

        +

      Returns Promise<Response>

      Promise with a task function response that will be fulfilled when the task is completed.

      +
    • Gets the worker information given its worker node key.

      Parameters

      • workerNodeKey: number

        The worker node key.

      Returns undefined | WorkerInfo

      The worker information.

      -
    • Gets the worker node key given its worker id.

      -

      Parameters

      • workerId: undefined | number

        The worker id.

        -

      Returns number

      The worker node key if the worker id is found in the pool worker nodes, -1 otherwise.

      -
    • Gets worker node task function priority, if any.

      -

      Parameters

      • workerNodeKey: number

        The worker node key.

        -
      • Optional name: string

        The task function name.

        -

      Returns undefined | number

      The worker node task function priority if the worker node task function priority is defined, undefined otherwise.

      -
    • Gets worker node task function worker choice strategy, if any.

      -

      Parameters

      • workerNodeKey: number

        The worker node key.

        -
      • Optional name: string

        The task function name.

        -

      Returns undefined | "ROUND_ROBIN" | "LEAST_USED" | "LEAST_BUSY" | "LEAST_ELU" | "FAIR_SHARE" | "WEIGHTED_ROUND_ROBIN" | "INTERLEAVED_WEIGHTED_ROUND_ROBIN"

      The worker node task function worker choice strategy if the worker node task function worker choice strategy is defined, undefined otherwise.

      -
    • Whether worker nodes are executing concurrently their tasks quota or not.

      Returns boolean

      Worker nodes busyness boolean status.

      -
    • Returns whether the worker is the main worker or not.

      Returns boolean

      true if the worker is the main worker, false otherwise.

      -
    • Registers once a listener callback on the worker given its worker node key.

      +
    • Parameters

      • data: Iterable<Data>

        The tasks iterable input data for the specified task function. This can only be an iterable of structured-cloneable data.

        +
      • Optionalname: string

        The optional name of the task function to execute. If not specified, the default task function will be executed.

        +
      • OptionaltransferList: readonly TransferListItem[]

        An optional array of transferable objects to transfer ownership of. Ownership of the transferred objects is given to the chosen pool's worker_threads worker and they should not be used in the main thread afterwards.

        +

      Returns Promise<Response[]>

      Promise with an array of task function responses that will be fulfilled when the tasks are completed.

      +
    • Registers once a listener callback on the worker given its worker node key.

      Type Parameters

      • Message

      Parameters

      • workerNodeKey: number

        The worker node key.

        -
      • listener: ((message) => void)

        The message listener callback.

        -

      Returns void

    • Registers a listener callback on the worker given its worker node key.

      +
    • listener: ((message: MessageValue<Message, unknown>) => void)

      The message listener callback.

      +

    Returns void

    • Registers a listener callback on the worker given its worker node key.

      Type Parameters

      • Message

      Parameters

      • workerNodeKey: number

        The worker node key.

        -
      • listener: ((message) => void)

        The message listener callback.

        -

      Returns void

    • Parameters

      • workerNodeKey: number
      • taskName: string

      Returns void

    • Sends the startup message to worker given its worker node key.

      +
    • listener: ((message: MessageValue<Message, unknown>) => void)

      The message listener callback.

      +

    Returns void

    • Sends the startup message to worker given its worker node key.

      Parameters

      • workerNodeKey: number

        The worker node key.

        -

      Returns void

    • Sends the statistics message to worker given its worker node key.

      -

      Parameters

      • workerNodeKey: number

        The worker node key.

        -

      Returns void

    • Sends a message to worker given its worker node key.

      +

    Returns void

    • Sends a message to worker given its worker node key.

      Parameters

      • workerNodeKey: number

        The worker node key.

      • message: MessageValue<Data, unknown>

        The message.

        -
      • Optional transferList: readonly TransferListItem[]

        The optional array of transferable objects.

        -

      Returns void

    • Setup hook to execute code before worker nodes are created in the abstract constructor. +

    • OptionaltransferList: readonly TransferListItem[]

      The optional array of transferable objects.

      +

    Returns void

    • Parameters

      • workerChoiceStrategy:
            | "ROUND_ROBIN"
            | "LEAST_USED"
            | "LEAST_BUSY"
            | "LEAST_ELU"
            | "FAIR_SHARE"
            | "WEIGHTED_ROUND_ROBIN"
            | "INTERLEAVED_WEIGHTED_ROUND_ROBIN"
      • OptionalworkerChoiceStrategyOptions: WorkerChoiceStrategyOptions

      Returns void

    • Setup hook to execute code before worker nodes are created in the abstract constructor. Can be overridden.

      -

      Returns void

    • Conditions for dynamic worker creation.

      Returns boolean

      Whether to create a dynamic worker or not.

      -
    • Whether the worker node shall update its task function worker usage or not.

      -

      Parameters

      • workerNodeKey: number

        The worker node key.

        -

      Returns boolean

      true if the worker node shall update its task function worker usage, false otherwise.

      -
    • Starts the minimum number of workers.

      -

      Parameters

      • initWorkerNodeUsage: boolean = false

        Whether to initialize the worker node usage or not.

        -

      Returns void

      Default Value

      false
      -
      -
    • Parameters

      • workerNodeKey: number
      • taskName: string
      • Optional previousTaskName: string

      Returns void

    • Parameters

      • workerNodeKey: number
      • taskName: string

      Returns void

    \ No newline at end of file +

    Returns void

    \ No newline at end of file diff --git a/docs/classes/AbstractWorker.html b/docs/classes/AbstractWorker.html index 49e21de7..f42049e1 100644 --- a/docs/classes/AbstractWorker.html +++ b/docs/classes/AbstractWorker.html @@ -1,23 +1,16 @@ -AbstractWorker | poolifier - v4.0.15

    Class AbstractWorker<MainWorker, Data, Response>Abstract

    Base class that implements some shared logic for all poolifier workers.

    +AbstractWorker | poolifier - v4.0.15

    Class AbstractWorker<MainWorker, Data, Response>Abstract

    Base class that implements some shared logic for all poolifier workers.

    Type Parameters

    • MainWorker extends Worker | MessagePort

      Type of main worker.

      -
    • Data = unknown

      Type of data this worker receives from pool's execution. This can only be structured-cloneable data.

      +
    • Data = unknown

      Type of data this worker receives from pool's execution. This can only be structured-cloneable data.

    • Response = unknown

      Type of response the worker sends back to the main worker. This can only be structured-cloneable data.

      -

    Hierarchy (view full)

    Constructors

    Properties

    activeInterval?: Timeout

    Handler id of the activeInterval worker activity check.

    -
    id: number

    Worker id.

    -
    isMain: undefined | boolean

    Whether this is the main worker or not.

    -
    lastTaskTimestamp: number

    Timestamp of the last task processed by this worker.

    -
    mainWorker: undefined | null | MainWorker

    Reference to main worker.

    -
    opts: WorkerOptions = DEFAULT_WORKER_OPTIONS

    Options for the worker.

    -
    statistics?: WorkerStatistics

    Performance statistics computation requirements.

    -
    taskFunctions: Map<string, TaskFunctionObject<Data, Response>>

    Task function object(s) processed by the worker when the pool's execution function is invoked.

    -

    Methods

    Returns AbstractWorker<MainWorker, Data, Response>

    Properties

    activeInterval?: Timeout

    Handler id of the activeInterval worker activity check.

    +
    id: number

    Worker id.

    +
    isMain: undefined | boolean

    Whether this is the main worker or not.

    +
    lastTaskTimestamp: number

    Timestamp of the last task processed by this worker.

    +
    opts: WorkerOptions = DEFAULT_WORKER_OPTIONS

    Options for the worker.

    +
    statistics?: WorkerStatistics

    Performance statistics computation requirements.

    +
    taskFunctions: Map<string, TaskFunctionObject<Data, Response>>

    Task function object(s) processed by the worker when the pool's execution function is invoked.

    +

    Methods

    • Handles an error and convert it to a string so it can be sent back to the main worker.

      Parameters

      • error: string | Error

        The error raised by the worker.

      Returns string

      The error message.

      -
    • Handles the ready message sent by the main worker.

      +

    Returns void

    Returns void

    Returns void

    • Runs the given task function asynchronously.

      +

    Returns void

    • Runs the given task function synchronously.

      +

    Returns void

    • Sends a message to main worker.

      +

    Returns void

    Returns void

    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/classes/CircularBuffer.html b/docs/classes/CircularBuffer.html index 2ebcde63..578f6b8f 100644 --- a/docs/classes/CircularBuffer.html +++ b/docs/classes/CircularBuffer.html @@ -1,30 +1,24 @@ -CircularBuffer | poolifier - v4.0.15

    Class CircularBufferInternal

    Circular buffer designed for positive numbers.

    -

    Constructors

    Properties

    Methods

    checkSize -empty +CircularBuffer | poolifier - v4.0.15

    Class CircularBufferInternal

    Circular buffer designed for positive numbers.

    +

    Constructors

    Properties

    Methods

    Constructors

    • Parameters

      • size: number = defaultBufferSize

        Buffer size.

        +

    Constructors

    Properties

    items: Float32Array
    maxArrayIdx: number
    readIdx: number
    size: number
    writeIdx: number

    Methods

    • Checks the buffer size.

      -

      Parameters

      • size: number

        Buffer size.

        -

      Returns void

    • Checks whether the buffer is empty.

      +
      defaultBufferSize
      +
      + +

    Properties

    size: number

    Methods

    • Checks whether the buffer is empty.

      Returns boolean

      Whether the buffer is empty.

      -
    • Checks whether the buffer is full.

      Returns boolean

      Whether the buffer is full.

      -
    • Gets number from buffer.

      Returns undefined | number

      Number from buffer.

      -
    • Puts number into buffer.

      Parameters

      • number: number

        Number to put into buffer.

        -

      Returns void

    \ No newline at end of file +

    Returns void

    \ No newline at end of file diff --git a/docs/classes/ClusterWorker.html b/docs/classes/ClusterWorker.html index aaea291e..c0f5daf0 100644 --- a/docs/classes/ClusterWorker.html +++ b/docs/classes/ClusterWorker.html @@ -1,13 +1,13 @@ -ClusterWorker | poolifier - v4.0.15

    Class ClusterWorker<Data, Response>

    A cluster worker used by a poolifier ClusterPool.

    +ClusterWorker | poolifier - v4.0.15

    Class ClusterWorker<Data, Response>

    A cluster worker used by a poolifier ClusterPool.

    When this worker is inactive for more than the given maxInactiveTime, it will send a termination request to its main worker.

    If you use a DynamicClusterPool the extra workers that were created will be terminated, but the minimum number of workers will be guaranteed.

    -

    Author

    Christopher Quadflieg

    -

    Since

    2.0.0

    -

    Type Parameters

    • Data = unknown

      Type of data this worker receives from pool's execution. This can only be structured-cloneable data.

      +

      Christopher Quadflieg

      +

      2.0.0

      +

    Type Parameters

    • Data = unknown

      Type of data this worker receives from pool's execution. This can only be structured-cloneable data.

    • Response = unknown

      Type of response the worker sends back to the main worker. This can only be structured-cloneable data.

      -

    Hierarchy (view full)

    Constructors

    Hierarchy (view full)

    Constructors

    Properties

    activeInterval? isMain lastTaskTimestamp @@ -31,53 +31,53 @@ but the minimum number of workers will be guaranteed.

    sendTaskFunctionsPropertiesToMainWorker sendToMainWorker setDefaultTaskFunction -

    Constructors

    Constructors

    Properties

    activeInterval?: Timeout

    Handler id of the activeInterval worker activity check.

    -
    isMain: undefined | boolean

    Whether this is the main worker or not.

    -
    lastTaskTimestamp: number

    Timestamp of the last task processed by this worker.

    -
    opts: WorkerOptions = DEFAULT_WORKER_OPTIONS

    Options for the worker.

    -
    statistics?: WorkerStatistics

    Performance statistics computation requirements.

    -
    taskFunctions: Map<string, TaskFunctionObject<Data, Response>>

    Task function object(s) processed by the worker when the pool's execution function is invoked.

    -

    Accessors

    Methods

    Returns ClusterWorker<Data, Response>

    Properties

    activeInterval?: Timeout

    Handler id of the activeInterval worker activity check.

    +
    isMain: undefined | boolean

    Whether this is the main worker or not.

    +
    lastTaskTimestamp: number

    Timestamp of the last task processed by this worker.

    +
    opts: WorkerOptions = DEFAULT_WORKER_OPTIONS

    Options for the worker.

    +
    statistics?: WorkerStatistics

    Performance statistics computation requirements.

    +
    taskFunctions: Map<string, TaskFunctionObject<Data, Response>>

    Task function object(s) processed by the worker when the pool's execution function is invoked.

    +

    Accessors

    Methods

    • Handles an error and convert it to a string so it can be sent back to the main worker.

      Parameters

      • error: string | Error

        The error raised by the worker.

      Returns string

      The error message.

      -
    • Handles the ready message sent by the main worker.

      +

    Returns void

    Returns void

    Returns void

    • Runs the given task function asynchronously.

      +

    Returns void

    • Runs the given task function synchronously.

      +

    Returns void

    • Sends a message to main worker.

      +

    Returns void

    Returns void

    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/classes/DynamicClusterPool.html b/docs/classes/DynamicClusterPool.html index 7b1fb47a..17b4b9e0 100644 --- a/docs/classes/DynamicClusterPool.html +++ b/docs/classes/DynamicClusterPool.html @@ -1,11 +1,11 @@ -DynamicClusterPool | poolifier - v4.0.15

    Class DynamicClusterPool<Data, Response>

    A cluster pool with a dynamic number of workers, but a guaranteed minimum number of workers.

    +DynamicClusterPool | poolifier - v4.0.15

    Class DynamicClusterPool<Data, Response>

    A cluster pool with a dynamic number of workers, but a guaranteed minimum number of workers.

    This cluster pool creates new workers when the others are busy, up to the maximum number of workers. -When the maximum number of workers is reached and workers are busy, an event is emitted. If you want to listen to this event, use the pool's emitter.

    -

    Author

    Christopher Quadflieg

    -

    Since

    2.0.0

    +When the maximum number of workers is reached and workers are busy, an event is emitted. If you want to listen to this event, use the pool's emitter.

    +

    Christopher Quadflieg

    +

    2.0.0

    Type Parameters

    • Data = unknown

      Type of data sent to the worker. This can only be structured-cloneable data.

    • Response = unknown

      Type of execution response. This can only be structured-cloneable data.

      -

    Hierarchy (view full)

    Constructors

    Hierarchy (view full)

    Constructors

    Properties

    emitter? filePath maximumNumberOfWorkers? @@ -18,9 +18,7 @@ When the maximum number of workers is reached and workers are busy, an event is empty full info -ready type -utilization worker

    Methods

    addTaskFunction afterTaskExecutionHook @@ -55,93 +53,109 @@ When the maximum number of workers is reached and workers are busy, an event is shallCreateDynamicWorker start workerMessageListener -

    Constructors

    Constructors

    Properties

    emitter?: EventEmitterAsyncResource

    Pool event emitter integrated with async resource. +

    Returns DynamicClusterPool<Data, Response>

    Properties

    emitter?: EventEmitterAsyncResource

    Pool event emitter integrated with async resource. The async tracking tooling identifier is poolifier:<PoolType>-<WorkerType>-pool.

    Events that can currently be listened to:

      -
    • 'ready': Emitted when the number of workers created in the pool has reached the minimum size expected and are ready. If the pool is dynamic with a minimum number of workers is set to zero, this event is emitted when at least one dynamic worker is ready.
    • -
    • 'busy': Emitted when the number of workers created in the pool has reached the maximum size expected and are executing concurrently their tasks quota.
    • -
    • 'full': Emitted when the pool is dynamic and the number of workers created has reached the maximum size expected.
    • -
    • 'empty': Emitted when the pool is dynamic with a minimum number of workers set to zero and the number of workers has reached the minimum size expected.
    • -
    • 'destroy': Emitted when the pool is destroyed.
    • -
    • 'error': Emitted when an uncaught error occurs.
    • -
    • 'taskError': Emitted when an error occurs while executing a task.
    • -
    • 'backPressure': Emitted when all worker nodes have back pressure (i.e. their tasks queue is full: queue size >= maximum queue size).
    • +
    • 'ready': Emitted when the number of workers created in the pool has reached the minimum size expected and are ready. If the pool is dynamic with a minimum number of workers is set to zero, this event is emitted when at least one dynamic worker is ready.
    • +
    • 'busy': Emitted when the number of workers created in the pool has reached the maximum size expected and are executing concurrently their tasks quota.
    • +
    • 'full': Emitted when the pool is dynamic and the number of workers created has reached the maximum size expected.
    • +
    • 'empty': Emitted when the pool is dynamic with a minimum number of workers set to zero and the number of workers has reached the minimum size expected.
    • +
    • 'destroy': Emitted when the pool is destroyed.
    • +
    • 'error': Emitted when an uncaught error occurs.
    • +
    • 'taskError': Emitted when an error occurs while executing a task.
    • +
    • 'backPressure': Emitted when all worker nodes have back pressure (i.e. their tasks queue is full: queue size >= maximum queue size).
    -
    filePath: string

    Path to the worker file.

    -
    maximumNumberOfWorkers?: number

    Maximum number of workers that this pool manages.

    -
    minimumNumberOfWorkers: number

    Minimum number of workers that this pool manages.

    -
    opts: PoolOptions<Worker>

    Options for the pool.

    -
    promiseResponseMap: Map<`${string}-${string}-${string}-${string}-${string}`, PromiseResponseWrapper<Response>> = ...

    The task execution response promise map:

    +
    filePath: string

    Path to the worker file.

    +
    maximumNumberOfWorkers?: number

    Maximum number of workers that this pool manages.

    +
    minimumNumberOfWorkers: number

    Minimum number of workers that this pool manages.

    +
    opts: PoolOptions<Worker>

    Options for the pool.

    +
    promiseResponseMap: Map<`${string}-${string}-${string}-${string}-${string}`, PromiseResponseWrapper<Response>> = ...

    The task execution response promise map:

    • key: The message id of each submitted task.
    • -
    • value: An object that contains task's worker node key, execution response promise resolve and reject callbacks, async resource.
    • +
    • value: An object that contains task's worker node key, execution response promise resolve and reject callbacks, async resource.

    When we receive a message from the worker, we get a map entry with the promise resolve/reject bound to the message id.

    -
    workerChoiceStrategiesContext?: WorkerChoiceStrategiesContext<Worker, Data, Response>

    Worker choice strategies context referencing worker choice algorithms implementation.

    -
    workerNodes: IWorkerNode<Worker, Data>[] = []

    Pool worker nodes.

    -

    Accessors

    workerChoiceStrategiesContext?: WorkerChoiceStrategiesContext<Worker, Data, Response>

    Worker choice strategies context referencing worker choice algorithms implementation.

    +
    workerNodes: IWorkerNode<Worker, Data>[] = []

    Pool worker nodes.

    +

    Accessors

    • get busy(): boolean
    • Whether the pool is busy or not.

      Returns boolean

      The pool busyness boolean status.

      -
    • get empty(): boolean
    • Whether the pool is empty or not.

      Returns boolean

      The pool emptiness boolean status.

      -
    • get full(): boolean
    • Whether the pool is full or not.

      Returns boolean

      The pool fullness boolean status.

      -
    • get ready(): boolean
    • Whether the pool is ready or not.

      -

      Returns boolean

      The pool readiness boolean status.

      -
    • get type(): "fixed" | "dynamic"
    • The pool type.

      -

      If it is 'dynamic', it provides the max property.

      -

      Returns "fixed" | "dynamic"

    • get utilization(): number
    • The approximate pool utilization.

      -

      Returns number

      The pool utilization.

      -
    • get worker(): "thread" | "cluster"
    • The worker type.

      -

      Returns "thread" | "cluster"

    Methods

    • Hook executed after the worker task execution. +

    • get type(): "fixed" | "dynamic"
    • The pool type.

      +

      If it is 'dynamic', it provides the max property.

      +

      Returns "fixed" | "dynamic"

    • get worker(): "thread" | "cluster"
    • The worker type.

      +

      Returns "thread" | "cluster"

    Methods

    • Method hooked up after a worker node has been newly created. +

    Returns void

    • Hook executed before the worker task execution. +

    Returns void

    • Creates a new, completely set up dynamic worker node.

      +

    Returns void

    • Terminates the worker node given its worker node key.

      +
    • listener: ((message: MessageValue<Message, unknown>) => void)

      The message listener callback.

      +

    Returns void

    • Gets the worker information given its worker node key.

      +

    Returns Promise<void>

    • Parameters

      • Optionaldata: Data

        The optional task input data for the specified task function. This can only be structured-cloneable data.

        +
      • Optionalname: string

        The optional name of the task function to execute. If not specified, the default task function will be executed.

        +
      • OptionaltransferList: readonly TransferListItem[]

        An optional array of transferable objects to transfer ownership of. Ownership of the transferred objects is given to the chosen pool's worker_threads worker and they should not be used in the main thread afterwards.

        +

      Returns Promise<Response>

      Promise with a task function response that will be fulfilled when the task is completed.

      +
    • Parameters

      • data: Iterable<Data>

        The tasks iterable input data for the specified task function. This can only be an iterable of structured-cloneable data.

        +
      • Optionalname: string

        The optional name of the task function to execute. If not specified, the default task function will be executed.

        +
      • OptionaltransferList: readonly TransferListItem[]

        An optional array of transferable objects to transfer ownership of. Ownership of the transferred objects is given to the chosen pool's worker_threads worker and they should not be used in the main thread afterwards.

        +

      Returns Promise<Response[]>

      Promise with an array of task function responses that will be fulfilled when the tasks are completed.

      +
    • Registers a listener callback on the worker given its worker node key.

      +
    • listener: ((message: MessageValue<Message, unknown>) => void)

      The message listener callback.

      +

    Returns void

    • Sends the startup message to worker given its worker node key.

      +
    • listener: ((message: MessageValue<Message, unknown>) => void)

      The message listener callback.

      +

    Returns void

    • Sends a message to worker given its worker node key.

      +

    Returns void

    • Setup hook to execute code before worker nodes are created in the abstract constructor. +

    Returns void

    • Parameters

      • workerChoiceStrategy:
            | "ROUND_ROBIN"
            | "LEAST_USED"
            | "LEAST_BUSY"
            | "LEAST_ELU"
            | "FAIR_SHARE"
            | "WEIGHTED_ROUND_ROBIN"
            | "INTERLEAVED_WEIGHTED_ROUND_ROBIN"
      • OptionalworkerChoiceStrategyOptions: WorkerChoiceStrategyOptions

      Returns void

    \ No newline at end of file +

    Returns void

    \ No newline at end of file diff --git a/docs/classes/DynamicThreadPool.html b/docs/classes/DynamicThreadPool.html index f81194d0..5407127f 100644 --- a/docs/classes/DynamicThreadPool.html +++ b/docs/classes/DynamicThreadPool.html @@ -1,11 +1,11 @@ -DynamicThreadPool | poolifier - v4.0.15

    Class DynamicThreadPool<Data, Response>

    A thread pool with a dynamic number of threads, but a guaranteed minimum number of threads.

    +DynamicThreadPool | poolifier - v4.0.15

    Class DynamicThreadPool<Data, Response>

    A thread pool with a dynamic number of threads, but a guaranteed minimum number of threads.

    This thread pool creates new threads when the others are busy, up to the maximum number of threads. -When the maximum number of threads is reached and workers are busy, an event is emitted. If you want to listen to this event, use the pool's emitter.

    -

    Author

    Alessandro Pio Ardizio

    -

    Since

    0.0.1

    +When the maximum number of threads is reached and workers are busy, an event is emitted. If you want to listen to this event, use the pool's emitter.

    +

    Alessandro Pio Ardizio

    +

    0.0.1

    Type Parameters

    • Data = unknown

      Type of data sent to the worker. This can only be structured-cloneable data.

    • Response = unknown

      Type of execution response. This can only be structured-cloneable data.

      -

    Hierarchy (view full)

    Constructors

    Hierarchy (view full)

    Constructors

    Properties

    emitter? filePath maximumNumberOfWorkers? @@ -18,9 +18,7 @@ When the maximum number of threads is reached and workers are busy, an event is empty full info -ready type -utilization worker

    Methods

    addTaskFunction afterTaskExecutionHook @@ -55,94 +53,110 @@ When the maximum number of threads is reached and workers are busy, an event is shallCreateDynamicWorker start workerMessageListener -

    Constructors

    Constructors

    Properties

    emitter?: EventEmitterAsyncResource

    Pool event emitter integrated with async resource. +

    Returns DynamicThreadPool<Data, Response>

    Properties

    emitter?: EventEmitterAsyncResource

    Pool event emitter integrated with async resource. The async tracking tooling identifier is poolifier:<PoolType>-<WorkerType>-pool.

    Events that can currently be listened to:

      -
    • 'ready': Emitted when the number of workers created in the pool has reached the minimum size expected and are ready. If the pool is dynamic with a minimum number of workers is set to zero, this event is emitted when at least one dynamic worker is ready.
    • -
    • 'busy': Emitted when the number of workers created in the pool has reached the maximum size expected and are executing concurrently their tasks quota.
    • -
    • 'full': Emitted when the pool is dynamic and the number of workers created has reached the maximum size expected.
    • -
    • 'empty': Emitted when the pool is dynamic with a minimum number of workers set to zero and the number of workers has reached the minimum size expected.
    • -
    • 'destroy': Emitted when the pool is destroyed.
    • -
    • 'error': Emitted when an uncaught error occurs.
    • -
    • 'taskError': Emitted when an error occurs while executing a task.
    • -
    • 'backPressure': Emitted when all worker nodes have back pressure (i.e. their tasks queue is full: queue size >= maximum queue size).
    • +
    • 'ready': Emitted when the number of workers created in the pool has reached the minimum size expected and are ready. If the pool is dynamic with a minimum number of workers is set to zero, this event is emitted when at least one dynamic worker is ready.
    • +
    • 'busy': Emitted when the number of workers created in the pool has reached the maximum size expected and are executing concurrently their tasks quota.
    • +
    • 'full': Emitted when the pool is dynamic and the number of workers created has reached the maximum size expected.
    • +
    • 'empty': Emitted when the pool is dynamic with a minimum number of workers set to zero and the number of workers has reached the minimum size expected.
    • +
    • 'destroy': Emitted when the pool is destroyed.
    • +
    • 'error': Emitted when an uncaught error occurs.
    • +
    • 'taskError': Emitted when an error occurs while executing a task.
    • +
    • 'backPressure': Emitted when all worker nodes have back pressure (i.e. their tasks queue is full: queue size >= maximum queue size).
    -
    filePath: string

    Path to the worker file.

    -
    maximumNumberOfWorkers?: number

    Maximum number of workers that this pool manages.

    -
    minimumNumberOfWorkers: number

    Minimum number of workers that this pool manages.

    -
    opts: PoolOptions<Worker>

    Options for the pool.

    -
    promiseResponseMap: Map<`${string}-${string}-${string}-${string}-${string}`, PromiseResponseWrapper<Response>> = ...

    The task execution response promise map:

    +
    filePath: string

    Path to the worker file.

    +
    maximumNumberOfWorkers?: number

    Maximum number of workers that this pool manages.

    +
    minimumNumberOfWorkers: number

    Minimum number of workers that this pool manages.

    +
    opts: PoolOptions<Worker>

    Options for the pool.

    +
    promiseResponseMap: Map<`${string}-${string}-${string}-${string}-${string}`, PromiseResponseWrapper<Response>> = ...

    The task execution response promise map:

    • key: The message id of each submitted task.
    • -
    • value: An object that contains task's worker node key, execution response promise resolve and reject callbacks, async resource.
    • +
    • value: An object that contains task's worker node key, execution response promise resolve and reject callbacks, async resource.

    When we receive a message from the worker, we get a map entry with the promise resolve/reject bound to the message id.

    -
    workerChoiceStrategiesContext?: WorkerChoiceStrategiesContext<Worker, Data, Response>

    Worker choice strategies context referencing worker choice algorithms implementation.

    -
    workerNodes: IWorkerNode<Worker, Data>[] = []

    Pool worker nodes.

    -

    Accessors

    workerChoiceStrategiesContext?: WorkerChoiceStrategiesContext<Worker, Data, Response>

    Worker choice strategies context referencing worker choice algorithms implementation.

    +
    workerNodes: IWorkerNode<Worker, Data>[] = []

    Pool worker nodes.

    +

    Accessors

    • get busy(): boolean
    • Whether the pool is busy or not.

      Returns boolean

      The pool busyness boolean status.

      -
    • get empty(): boolean
    • Whether the pool is empty or not.

      Returns boolean

      The pool emptiness boolean status.

      -
    • get full(): boolean
    • Whether the pool is full or not.

      Returns boolean

      The pool fullness boolean status.

      -
    • get ready(): boolean
    • Whether the pool is ready or not.

      -

      Returns boolean

      The pool readiness boolean status.

      -
    • get type(): "fixed" | "dynamic"
    • The pool type.

      -

      If it is 'dynamic', it provides the max property.

      -

      Returns "fixed" | "dynamic"

    • get utilization(): number
    • The approximate pool utilization.

      -

      Returns number

      The pool utilization.

      -
    • get worker(): "thread" | "cluster"
    • The worker type.

      -

      Returns "thread" | "cluster"

    Methods

    • Hook executed after the worker task execution. +

    • get type(): "fixed" | "dynamic"
    • The pool type.

      +

      If it is 'dynamic', it provides the max property.

      +

      Returns "fixed" | "dynamic"

    • get worker(): "thread" | "cluster"
    • The worker type.

      +

      Returns "thread" | "cluster"

    Methods

    • Method hooked up after a worker node has been newly created. +

    Returns void

    • Hook executed before the worker task execution. +

    Returns void

    • Creates a new, completely set up dynamic worker node.

      +

    Returns void

    • Terminates the worker node given its worker node key.

      +
    • listener: ((message: MessageValue<Message, unknown>) => void)

      The message listener callback.

      +

    Returns void

    • Gets the worker information given its worker node key.

      +

    Returns Promise<void>

    • Parameters

      • Optionaldata: Data

        The optional task input data for the specified task function. This can only be structured-cloneable data.

        +
      • Optionalname: string

        The optional name of the task function to execute. If not specified, the default task function will be executed.

        +
      • OptionaltransferList: readonly TransferListItem[]

        An optional array of transferable objects to transfer ownership of. Ownership of the transferred objects is given to the chosen pool's worker_threads worker and they should not be used in the main thread afterwards.

        +

      Returns Promise<Response>

      Promise with a task function response that will be fulfilled when the task is completed.

      +
    • Parameters

      • data: Iterable<Data>

        The tasks iterable input data for the specified task function. This can only be an iterable of structured-cloneable data.

        +
      • Optionalname: string

        The optional name of the task function to execute. If not specified, the default task function will be executed.

        +
      • OptionaltransferList: readonly TransferListItem[]

        An optional array of transferable objects to transfer ownership of. Ownership of the transferred objects is given to the chosen pool's worker_threads worker and they should not be used in the main thread afterwards.

        +

      Returns Promise<Response[]>

      Promise with an array of task function responses that will be fulfilled when the tasks are completed.

      +
    • Registers a listener callback on the worker given its worker node key.

      +
    • listener: ((message: MessageValue<Message, unknown>) => void)

      The message listener callback.

      +

    Returns void

    • Sends the startup message to worker given its worker node key.

      +
    • listener: ((message: MessageValue<Message, unknown>) => void)

      The message listener callback.

      +

    Returns void

    • Sends a message to worker given its worker node key.

      +

    Returns void

    • Sends a message to worker given its worker node key.

      Parameters

      • workerNodeKey: number

        The worker node key.

      • message: MessageValue<Data, unknown>

        The message.

        -
      • Optional transferList: readonly TransferListItem[]

        The optional array of transferable objects.

        -

      Returns void

    • Setup hook to execute code before worker nodes are created in the abstract constructor. +

    • OptionaltransferList: readonly TransferListItem[]

      The optional array of transferable objects.

      +

    Returns void

    • Parameters

      • workerChoiceStrategy:
            | "ROUND_ROBIN"
            | "LEAST_USED"
            | "LEAST_BUSY"
            | "LEAST_ELU"
            | "FAIR_SHARE"
            | "WEIGHTED_ROUND_ROBIN"
            | "INTERLEAVED_WEIGHTED_ROUND_ROBIN"
      • OptionalworkerChoiceStrategyOptions: WorkerChoiceStrategyOptions

      Returns void

    \ No newline at end of file +

    Returns void

    \ No newline at end of file diff --git a/docs/classes/FixedClusterPool.html b/docs/classes/FixedClusterPool.html index f0527fbc..51ef0086 100644 --- a/docs/classes/FixedClusterPool.html +++ b/docs/classes/FixedClusterPool.html @@ -1,9 +1,9 @@ -FixedClusterPool | poolifier - v4.0.15

    Class FixedClusterPool<Data, Response>

    A cluster pool with a fixed number of workers.

    -

    Author

    Christopher Quadflieg

    -

    Since

    2.0.0

    +FixedClusterPool | poolifier - v4.0.15

    Class FixedClusterPool<Data, Response>

    A cluster pool with a fixed number of workers.

    +

    Christopher Quadflieg

    +

    2.0.0

    Type Parameters

    • Data = unknown

      Type of data sent to the worker. This can only be structured-cloneable data.

    • Response = unknown

      Type of execution response. This can only be structured-cloneable data.

      -

    Hierarchy (view full)

    Constructors

    Hierarchy (view full)

    Constructors

    Constructors

    Properties

    emitter?: EventEmitterAsyncResource

    Pool event emitter integrated with async resource. +

  • OptionalmaximumNumberOfWorkers: number

    The maximum number of workers for this pool.

    +
  • Returns FixedClusterPool<Data, Response>

    Properties

    emitter?: EventEmitterAsyncResource

    Pool event emitter integrated with async resource. The async tracking tooling identifier is poolifier:<PoolType>-<WorkerType>-pool.

    Events that can currently be listened to:

      -
    • 'ready': Emitted when the number of workers created in the pool has reached the minimum size expected and are ready. If the pool is dynamic with a minimum number of workers is set to zero, this event is emitted when at least one dynamic worker is ready.
    • -
    • 'busy': Emitted when the number of workers created in the pool has reached the maximum size expected and are executing concurrently their tasks quota.
    • -
    • 'full': Emitted when the pool is dynamic and the number of workers created has reached the maximum size expected.
    • -
    • 'empty': Emitted when the pool is dynamic with a minimum number of workers set to zero and the number of workers has reached the minimum size expected.
    • -
    • 'destroy': Emitted when the pool is destroyed.
    • -
    • 'error': Emitted when an uncaught error occurs.
    • -
    • 'taskError': Emitted when an error occurs while executing a task.
    • -
    • 'backPressure': Emitted when all worker nodes have back pressure (i.e. their tasks queue is full: queue size >= maximum queue size).
    • +
    • 'ready': Emitted when the number of workers created in the pool has reached the minimum size expected and are ready. If the pool is dynamic with a minimum number of workers is set to zero, this event is emitted when at least one dynamic worker is ready.
    • +
    • 'busy': Emitted when the number of workers created in the pool has reached the maximum size expected and are executing concurrently their tasks quota.
    • +
    • 'full': Emitted when the pool is dynamic and the number of workers created has reached the maximum size expected.
    • +
    • 'empty': Emitted when the pool is dynamic with a minimum number of workers set to zero and the number of workers has reached the minimum size expected.
    • +
    • 'destroy': Emitted when the pool is destroyed.
    • +
    • 'error': Emitted when an uncaught error occurs.
    • +
    • 'taskError': Emitted when an error occurs while executing a task.
    • +
    • 'backPressure': Emitted when all worker nodes have back pressure (i.e. their tasks queue is full: queue size >= maximum queue size).
    -
    filePath: string

    Path to the worker file.

    -
    maximumNumberOfWorkers?: number

    Maximum number of workers that this pool manages.

    -
    minimumNumberOfWorkers: number

    Minimum number of workers that this pool manages.

    -
    opts: PoolOptions<Worker>

    Options for the pool.

    -
    promiseResponseMap: Map<`${string}-${string}-${string}-${string}-${string}`, PromiseResponseWrapper<Response>> = ...

    The task execution response promise map:

    +
    filePath: string

    Path to the worker file.

    +
    maximumNumberOfWorkers?: number

    Maximum number of workers that this pool manages.

    +
    minimumNumberOfWorkers: number

    Minimum number of workers that this pool manages.

    +
    opts: PoolOptions<Worker>

    Options for the pool.

    +
    promiseResponseMap: Map<`${string}-${string}-${string}-${string}-${string}`, PromiseResponseWrapper<Response>> = ...

    The task execution response promise map:

    • key: The message id of each submitted task.
    • -
    • value: An object that contains task's worker node key, execution response promise resolve and reject callbacks, async resource.
    • +
    • value: An object that contains task's worker node key, execution response promise resolve and reject callbacks, async resource.

    When we receive a message from the worker, we get a map entry with the promise resolve/reject bound to the message id.

    -
    workerChoiceStrategiesContext?: WorkerChoiceStrategiesContext<Worker, Data, Response>

    Worker choice strategies context referencing worker choice algorithms implementation.

    -
    workerNodes: IWorkerNode<Worker, Data>[] = []

    Pool worker nodes.

    -

    Accessors

    workerChoiceStrategiesContext?: WorkerChoiceStrategiesContext<Worker, Data, Response>

    Worker choice strategies context referencing worker choice algorithms implementation.

    +
    workerNodes: IWorkerNode<Worker, Data>[] = []

    Pool worker nodes.

    +

    Accessors

    • get busy(): boolean
    • Whether the pool is busy or not.

      Returns boolean

      The pool busyness boolean status.

      -
    • get empty(): boolean
    • Whether the pool is empty or not.

      Returns boolean

      The pool emptiness boolean status.

      -
    • get full(): boolean
    • Whether the pool is full or not.

      Returns boolean

      The pool fullness boolean status.

      -
    • get ready(): boolean
    • Whether the pool is ready or not.

      -

      Returns boolean

      The pool readiness boolean status.

      -
    • get type(): "fixed" | "dynamic"
    • The pool type.

      -

      If it is 'dynamic', it provides the max property.

      -

      Returns "fixed" | "dynamic"

    • get utilization(): number
    • The approximate pool utilization.

      -

      Returns number

      The pool utilization.

      -
    • get worker(): "thread" | "cluster"
    • The worker type.

      -

      Returns "thread" | "cluster"

    Methods

    • Hook executed after the worker task execution. +

    • get type(): "fixed" | "dynamic"
    • The pool type.

      +

      If it is 'dynamic', it provides the max property.

      +

      Returns "fixed" | "dynamic"

    • get worker(): "thread" | "cluster"
    • The worker type.

      +

      Returns "thread" | "cluster"

    Methods

    • Method hooked up after a worker node has been newly created. +

    Returns void

    • Hook executed before the worker task execution. +

    Returns void

    • Creates a new, completely set up dynamic worker node.

      +

    Returns void

    • Terminates the worker node given its worker node key.

      +
    • listener: ((message: MessageValue<Message, unknown>) => void)

      The message listener callback.

      +

    Returns void

    • Gets the worker information given its worker node key.

      +

    Returns Promise<void>

    • Parameters

      • Optionaldata: Data

        The optional task input data for the specified task function. This can only be structured-cloneable data.

        +
      • Optionalname: string

        The optional name of the task function to execute. If not specified, the default task function will be executed.

        +
      • OptionaltransferList: readonly TransferListItem[]

        An optional array of transferable objects to transfer ownership of. Ownership of the transferred objects is given to the chosen pool's worker_threads worker and they should not be used in the main thread afterwards.

        +

      Returns Promise<Response>

      Promise with a task function response that will be fulfilled when the task is completed.

      +
    • Parameters

      • data: Iterable<Data>

        The tasks iterable input data for the specified task function. This can only be an iterable of structured-cloneable data.

        +
      • Optionalname: string

        The optional name of the task function to execute. If not specified, the default task function will be executed.

        +
      • OptionaltransferList: readonly TransferListItem[]

        An optional array of transferable objects to transfer ownership of. Ownership of the transferred objects is given to the chosen pool's worker_threads worker and they should not be used in the main thread afterwards.

        +

      Returns Promise<Response[]>

      Promise with an array of task function responses that will be fulfilled when the tasks are completed.

      +
    • Registers a listener callback on the worker given its worker node key.

      +
    • listener: ((message: MessageValue<Message, unknown>) => void)

      The message listener callback.

      +

    Returns void

    • Sends the startup message to worker given its worker node key.

      +
    • listener: ((message: MessageValue<Message, unknown>) => void)

      The message listener callback.

      +

    Returns void

    • Sends a message to worker given its worker node key.

      +

    Returns void

    • Setup hook to execute code before worker nodes are created in the abstract constructor. +

    Returns void

    • Parameters

      • workerChoiceStrategy:
            | "ROUND_ROBIN"
            | "LEAST_USED"
            | "LEAST_BUSY"
            | "LEAST_ELU"
            | "FAIR_SHARE"
            | "WEIGHTED_ROUND_ROBIN"
            | "INTERLEAVED_WEIGHTED_ROUND_ROBIN"
      • OptionalworkerChoiceStrategyOptions: WorkerChoiceStrategyOptions

      Returns void

    \ No newline at end of file +

    Returns void

    \ No newline at end of file diff --git a/docs/classes/FixedPriorityQueue.html b/docs/classes/FixedPriorityQueue.html index fa6e3ef2..436a8013 100644 --- a/docs/classes/FixedPriorityQueue.html +++ b/docs/classes/FixedPriorityQueue.html @@ -1,48 +1,45 @@ -FixedPriorityQueue | poolifier - v4.0.15

    Class FixedPriorityQueue<T>Internal

    Fixed priority queue.

    +FixedPriorityQueue | poolifier - v4.0.15

    Class FixedPriorityQueue<T>Internal

    Fixed priority queue.

    Type Parameters

    • T

      Type of fixed priority queue data.

      -

    Hierarchy (view full)

    Constructors

    Hierarchy (view full)

    Constructors

    • Constructs a fixed priority queue.

      +

    Constructors

    • Constructs a fixed priority queue.

      Type Parameters

      • T

      Parameters

      • size: number = defaultQueueSize

        Fixed priority queue size.

      • enablePriority: boolean = false

        Whether to enable priority.

      Returns FixedPriorityQueue<T>

      FixedPriorityQueue.

      -

      Default Value

      defaultQueueSize
      -
      -

      Default Value

      false
      -
      -

    Properties

    capacity: number

    The fixed priority queue capacity.

    -
    enablePriority: boolean

    Whether to enable priority.

    -
    size: number

    The fixed priority queue size.

    -
    start: number

    Methods

    • Returns an iterator for the fixed priority queue.

      +
      defaultQueueSize
      +
      + +
      false
      +
      + +

    Properties

    capacity: number

    The fixed priority queue capacity.

    +
    enablePriority: boolean

    Whether to enable priority.

    +
    size: number

    The fixed priority queue size.

    +

    Methods

    • Dequeue data from the fixed priority queue.

      Returns undefined | T

      The dequeued data or undefined if the priority queue is empty.

      -
    • Checks if the fixed priority queue is empty.

      Returns boolean

      true if the fixed priority queue is empty, false otherwise.

      -
    • Enqueue data into the fixed priority queue.

      Parameters

      • data: T

        Data to enqueue.

        -
      • Optional priority: number

        Priority of the data. Lower values have higher priority.

        +
      • Optionalpriority: number

        Priority of the data. Lower values have higher priority.

      Returns number

      The new size of the priority queue.

      -

      Throws

      If the fixed priority queue is full.

      -
    • Checks if the fixed priority queue is full.

      Returns boolean

      true if the fixed priority queue is full, false otherwise.

      -
    • Gets data from the fixed priority queue.

      Parameters

      • index: number

        The index of the data to get.

      Returns undefined | T

      The data at the index or undefined if the fixed priority queue is empty or the index is out of bounds.

      -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/classes/FixedThreadPool.html b/docs/classes/FixedThreadPool.html index a8a146ab..a60fda5b 100644 --- a/docs/classes/FixedThreadPool.html +++ b/docs/classes/FixedThreadPool.html @@ -1,9 +1,9 @@ -FixedThreadPool | poolifier - v4.0.15

    Class FixedThreadPool<Data, Response>

    A thread pool with a fixed number of threads.

    -

    Author

    Alessandro Pio Ardizio

    -

    Since

    0.0.1

    +FixedThreadPool | poolifier - v4.0.15

    Class FixedThreadPool<Data, Response>

    A thread pool with a fixed number of threads.

    +

    Alessandro Pio Ardizio

    +

    0.0.1

    Type Parameters

    • Data = unknown

      Type of data sent to the worker. This can only be structured-cloneable data.

    • Response = unknown

      Type of execution response. This can only be structured-cloneable data.

      -

    Hierarchy (view full)

    Constructors

    Hierarchy (view full)

    Constructors

    Constructors

    Properties

    emitter?: EventEmitterAsyncResource

    Pool event emitter integrated with async resource. +

  • OptionalmaximumNumberOfThreads: number

    The maximum number of threads for this pool.

    +
  • Returns FixedThreadPool<Data, Response>

    Properties

    emitter?: EventEmitterAsyncResource

    Pool event emitter integrated with async resource. The async tracking tooling identifier is poolifier:<PoolType>-<WorkerType>-pool.

    Events that can currently be listened to:

      -
    • 'ready': Emitted when the number of workers created in the pool has reached the minimum size expected and are ready. If the pool is dynamic with a minimum number of workers is set to zero, this event is emitted when at least one dynamic worker is ready.
    • -
    • 'busy': Emitted when the number of workers created in the pool has reached the maximum size expected and are executing concurrently their tasks quota.
    • -
    • 'full': Emitted when the pool is dynamic and the number of workers created has reached the maximum size expected.
    • -
    • 'empty': Emitted when the pool is dynamic with a minimum number of workers set to zero and the number of workers has reached the minimum size expected.
    • -
    • 'destroy': Emitted when the pool is destroyed.
    • -
    • 'error': Emitted when an uncaught error occurs.
    • -
    • 'taskError': Emitted when an error occurs while executing a task.
    • -
    • 'backPressure': Emitted when all worker nodes have back pressure (i.e. their tasks queue is full: queue size >= maximum queue size).
    • +
    • 'ready': Emitted when the number of workers created in the pool has reached the minimum size expected and are ready. If the pool is dynamic with a minimum number of workers is set to zero, this event is emitted when at least one dynamic worker is ready.
    • +
    • 'busy': Emitted when the number of workers created in the pool has reached the maximum size expected and are executing concurrently their tasks quota.
    • +
    • 'full': Emitted when the pool is dynamic and the number of workers created has reached the maximum size expected.
    • +
    • 'empty': Emitted when the pool is dynamic with a minimum number of workers set to zero and the number of workers has reached the minimum size expected.
    • +
    • 'destroy': Emitted when the pool is destroyed.
    • +
    • 'error': Emitted when an uncaught error occurs.
    • +
    • 'taskError': Emitted when an error occurs while executing a task.
    • +
    • 'backPressure': Emitted when all worker nodes have back pressure (i.e. their tasks queue is full: queue size >= maximum queue size).
    -
    filePath: string

    Path to the worker file.

    -
    maximumNumberOfWorkers?: number

    Maximum number of workers that this pool manages.

    -
    minimumNumberOfWorkers: number

    Minimum number of workers that this pool manages.

    -
    opts: PoolOptions<Worker>

    Options for the pool.

    -
    promiseResponseMap: Map<`${string}-${string}-${string}-${string}-${string}`, PromiseResponseWrapper<Response>> = ...

    The task execution response promise map:

    +
    filePath: string

    Path to the worker file.

    +
    maximumNumberOfWorkers?: number

    Maximum number of workers that this pool manages.

    +
    minimumNumberOfWorkers: number

    Minimum number of workers that this pool manages.

    +
    opts: PoolOptions<Worker>

    Options for the pool.

    +
    promiseResponseMap: Map<`${string}-${string}-${string}-${string}-${string}`, PromiseResponseWrapper<Response>> = ...

    The task execution response promise map:

    • key: The message id of each submitted task.
    • -
    • value: An object that contains task's worker node key, execution response promise resolve and reject callbacks, async resource.
    • +
    • value: An object that contains task's worker node key, execution response promise resolve and reject callbacks, async resource.

    When we receive a message from the worker, we get a map entry with the promise resolve/reject bound to the message id.

    -
    workerChoiceStrategiesContext?: WorkerChoiceStrategiesContext<Worker, Data, Response>

    Worker choice strategies context referencing worker choice algorithms implementation.

    -
    workerNodes: IWorkerNode<Worker, Data>[] = []

    Pool worker nodes.

    -

    Accessors

    workerChoiceStrategiesContext?: WorkerChoiceStrategiesContext<Worker, Data, Response>

    Worker choice strategies context referencing worker choice algorithms implementation.

    +
    workerNodes: IWorkerNode<Worker, Data>[] = []

    Pool worker nodes.

    +

    Accessors

    • get busy(): boolean
    • Whether the pool is busy or not.

      Returns boolean

      The pool busyness boolean status.

      -
    • get empty(): boolean
    • Whether the pool is empty or not.

      Returns boolean

      The pool emptiness boolean status.

      -
    • get full(): boolean
    • Whether the pool is full or not.

      Returns boolean

      The pool fullness boolean status.

      -
    • get ready(): boolean
    • Whether the pool is ready or not.

      -

      Returns boolean

      The pool readiness boolean status.

      -
    • get type(): "fixed" | "dynamic"
    • The pool type.

      -

      If it is 'dynamic', it provides the max property.

      -

      Returns "fixed" | "dynamic"

    • get utilization(): number
    • The approximate pool utilization.

      -

      Returns number

      The pool utilization.

      -
    • get worker(): "thread" | "cluster"
    • The worker type.

      -

      Returns "thread" | "cluster"

    Methods

    • Hook executed after the worker task execution. +

    • get type(): "fixed" | "dynamic"
    • The pool type.

      +

      If it is 'dynamic', it provides the max property.

      +

      Returns "fixed" | "dynamic"

    • get worker(): "thread" | "cluster"
    • The worker type.

      +

      Returns "thread" | "cluster"

    Methods

    • Method hooked up after a worker node has been newly created. +

    Returns void

    • Hook executed before the worker task execution. +

    Returns void

    • Creates a new, completely set up dynamic worker node.

      +

    Returns void

    • Terminates the worker node given its worker node key.

      +
    • listener: ((message: MessageValue<Message, unknown>) => void)

      The message listener callback.

      +

    Returns void

    • Gets the worker information given its worker node key.

      +

    Returns Promise<void>

    • Parameters

      • Optionaldata: Data

        The optional task input data for the specified task function. This can only be structured-cloneable data.

        +
      • Optionalname: string

        The optional name of the task function to execute. If not specified, the default task function will be executed.

        +
      • OptionaltransferList: readonly TransferListItem[]

        An optional array of transferable objects to transfer ownership of. Ownership of the transferred objects is given to the chosen pool's worker_threads worker and they should not be used in the main thread afterwards.

        +

      Returns Promise<Response>

      Promise with a task function response that will be fulfilled when the task is completed.

      +
    • Parameters

      • data: Iterable<Data>

        The tasks iterable input data for the specified task function. This can only be an iterable of structured-cloneable data.

        +
      • Optionalname: string

        The optional name of the task function to execute. If not specified, the default task function will be executed.

        +
      • OptionaltransferList: readonly TransferListItem[]

        An optional array of transferable objects to transfer ownership of. Ownership of the transferred objects is given to the chosen pool's worker_threads worker and they should not be used in the main thread afterwards.

        +

      Returns Promise<Response[]>

      Promise with an array of task function responses that will be fulfilled when the tasks are completed.

      +
    • Registers a listener callback on the worker given its worker node key.

      +
    • listener: ((message: MessageValue<Message, unknown>) => void)

      The message listener callback.

      +

    Returns void

    • Sends the startup message to worker given its worker node key.

      +
    • listener: ((message: MessageValue<Message, unknown>) => void)

      The message listener callback.

      +

    Returns void

    • Sends a message to worker given its worker node key.

      +

    Returns void

    • Sends a message to worker given its worker node key.

      Parameters

      • workerNodeKey: number

        The worker node key.

      • message: MessageValue<Data, unknown>

        The message.

        -
      • Optional transferList: readonly TransferListItem[]

        The optional array of transferable objects.

        -

      Returns void

    • Setup hook to execute code before worker nodes are created in the abstract constructor. +

    • OptionaltransferList: readonly TransferListItem[]

      The optional array of transferable objects.

      +

    Returns void

    • Parameters

      • workerChoiceStrategy:
            | "ROUND_ROBIN"
            | "LEAST_USED"
            | "LEAST_BUSY"
            | "LEAST_ELU"
            | "FAIR_SHARE"
            | "WEIGHTED_ROUND_ROBIN"
            | "INTERLEAVED_WEIGHTED_ROUND_ROBIN"
      • OptionalworkerChoiceStrategyOptions: WorkerChoiceStrategyOptions

      Returns void

    \ No newline at end of file +

    Returns void

    \ No newline at end of file diff --git a/docs/classes/PriorityQueue.html b/docs/classes/PriorityQueue.html index eef1b250..a74d4c91 100644 --- a/docs/classes/PriorityQueue.html +++ b/docs/classes/PriorityQueue.html @@ -1,10 +1,7 @@ -PriorityQueue | poolifier - v4.0.15

    Class PriorityQueue<T>Internal

    Priority queue.

    +PriorityQueue | poolifier - v4.0.15

    Class PriorityQueue<T>Internal

    Priority queue.

    Type Parameters

    • T

      Type of priority queue data.

      -

    Constructors

    Properties

    Constructors

    Properties

    Accessors

    Constructors

    • Constructs a priority queue.

      +

    Constructors

    • Constructs a priority queue.

      Type Parameters

      • T

      Parameters

      • bucketSize: number = defaultBucketSize

        Prioritized bucket size.

      • enablePriority: boolean = false

        Whether to enable priority.

      Returns PriorityQueue<T>

      PriorityQueue.

      -

      Default Value

      defaultBucketSize
      -
      -

      Default Value

      false
      -
      -

    Properties

    bucketSize: number
    maxSize: number

    The priority queue maximum size.

    -

    Accessors

    • get buckets(): number
    • The number of filled prioritized buckets.

      +
      defaultBucketSize
      +
      + +
      false
      +
      + +

    Properties

    maxSize: number

    The priority queue maximum size.

    +

    Accessors

    • get buckets(): number
    • The number of filled prioritized buckets.

      Returns number

      The number of filled prioritized buckets.

      -

    Methods

    Methods

    • Dequeue data from the priority queue.

      +

      Parameters

      • Optionalbucket: number

        The prioritized bucket to dequeue from.

      Returns undefined | T

      The dequeued data or undefined if the priority queue is empty.

      -
    • Enqueue data into the priority queue.

      Parameters

      • data: T

        Data to enqueue.

        -
      • Optional priority: number

        Priority of the data. Lower values have higher priority.

        +
      • Optionalpriority: number

        Priority of the data. Lower values have higher priority.

      Returns number

      The new size of the priority queue.

      -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/classes/ThreadWorker.html b/docs/classes/ThreadWorker.html index 8ea821d4..da0a27f8 100644 --- a/docs/classes/ThreadWorker.html +++ b/docs/classes/ThreadWorker.html @@ -1,18 +1,17 @@ -ThreadWorker | poolifier - v4.0.15

    Class ThreadWorker<Data, Response>

    A thread worker used by a poolifier ThreadPool.

    +ThreadWorker | poolifier - v4.0.15

    Class ThreadWorker<Data, Response>

    A thread worker used by a poolifier ThreadPool.

    When this worker is inactive for more than the given maxInactiveTime, it will send a termination request to its main thread.

    If you use a DynamicThreadPool the extra workers that were created will be terminated, but the minimum number of workers will be guaranteed.

    -

    Author

    Alessandro Pio Ardizio

    -

    Since

    0.0.1

    -

    Type Parameters

    • Data = unknown

      Type of data this worker receives from pool's execution. This can only be structured-cloneable data.

      +

      Alessandro Pio Ardizio

      +

      0.0.1

      +

    Type Parameters

    • Data = unknown

      Type of data this worker receives from pool's execution. This can only be structured-cloneable data.

    • Response = unknown

      Type of response the worker sends back to the main thread. This can only be structured-cloneable data.

      -

    Hierarchy (view full)

    Constructors

    Hierarchy (view full)

    Constructors

    Properties

    Accessors

    id @@ -32,54 +31,53 @@ but the minimum number of workers will be guaranteed.

    sendTaskFunctionsPropertiesToMainWorker sendToMainWorker setDefaultTaskFunction -

    Constructors

    Constructors

    Properties

    activeInterval?: Timeout

    Handler id of the activeInterval worker activity check.

    -
    isMain: undefined | boolean

    Whether this is the main worker or not.

    -
    lastTaskTimestamp: number

    Timestamp of the last task processed by this worker.

    -
    opts: WorkerOptions = DEFAULT_WORKER_OPTIONS

    Options for the worker.

    -
    port?: MessagePort

    Message port used to communicate with the main worker.

    -
    statistics?: WorkerStatistics

    Performance statistics computation requirements.

    -
    taskFunctions: Map<string, TaskFunctionObject<Data, Response>>

    Task function object(s) processed by the worker when the pool's execution function is invoked.

    -

    Accessors

    Methods

    Returns ThreadWorker<Data, Response>

    Properties

    activeInterval?: Timeout

    Handler id of the activeInterval worker activity check.

    +
    isMain: undefined | boolean

    Whether this is the main worker or not.

    +
    lastTaskTimestamp: number

    Timestamp of the last task processed by this worker.

    +
    opts: WorkerOptions = DEFAULT_WORKER_OPTIONS

    Options for the worker.

    +
    statistics?: WorkerStatistics

    Performance statistics computation requirements.

    +
    taskFunctions: Map<string, TaskFunctionObject<Data, Response>>

    Task function object(s) processed by the worker when the pool's execution function is invoked.

    +

    Accessors

    Methods

    • Handles an error and convert it to a string so it can be sent back to the main worker.

      Parameters

      • error: string | Error

        The error raised by the worker.

      Returns string

      The error message.

      -
    • Handles the ready message sent by the main worker.

      +

    Returns void

    Returns void

    Returns void

    • Runs the given task function asynchronously.

      +

    Returns void

    • Runs the given task function synchronously.

      +

    Returns void

    • Sends a message to main worker.

      +

    Returns void

    Returns void

    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/classes/WorkerChoiceStrategiesContext.html b/docs/classes/WorkerChoiceStrategiesContext.html index c79831fd..62d779ff 100644 --- a/docs/classes/WorkerChoiceStrategiesContext.html +++ b/docs/classes/WorkerChoiceStrategiesContext.html @@ -1,73 +1,48 @@ -WorkerChoiceStrategiesContext | poolifier - v4.0.15

    Class WorkerChoiceStrategiesContext<Worker, Data, Response>

    The worker choice strategies context.

    +WorkerChoiceStrategiesContext | poolifier - v4.0.15

    Class WorkerChoiceStrategiesContext<Worker, Data, Response>

    The worker choice strategies context.

    Type Parameters

    • Worker extends IWorker

      Type of worker.

    • Data = unknown

      Type of data sent to the worker. This can only be structured-cloneable data.

    • Response = unknown

      Type of execution response. This can only be structured-cloneable data.

      -

    Constructors

    Properties

    defaultWorkerChoiceStrategy: "ROUND_ROBIN" | "LEAST_USED" | "LEAST_BUSY" | "LEAST_ELU" | "FAIR_SHARE" | "WEIGHTED_ROUND_ROBIN" | "INTERLEAVED_WEIGHTED_ROUND_ROBIN"

    The default worker choice strategy in the context.

    -

    The pool instance.

    -
    retries: number

    The maximum number of worker choice strategies execution retries.

    -
    retriesCount: number

    The number of worker choice strategies execution retries.

    -
    workerChoiceStrategies: Map<"ROUND_ROBIN" | "LEAST_USED" | "LEAST_BUSY" | "LEAST_ELU" | "FAIR_SHARE" | "WEIGHTED_ROUND_ROBIN" | "INTERLEAVED_WEIGHTED_ROUND_ROBIN", IWorkerChoiceStrategy>

    The worker choice strategies registered in the context.

    -
    workerChoiceStrategiesPolicy: StrategyPolicy

    The active worker choice strategies in the context policy.

    -
    workerChoiceStrategiesTaskStatisticsRequirements: TaskStatisticsRequirements

    The active worker choice strategies in the context task statistics requirements.

    -

    Methods

    • Adds a worker choice strategy to the context.

      -

      Parameters

      • workerChoiceStrategy: "ROUND_ROBIN" | "LEAST_USED" | "LEAST_BUSY" | "LEAST_ELU" | "FAIR_SHARE" | "WEIGHTED_ROUND_ROBIN" | "INTERLEAVED_WEIGHTED_ROUND_ROBIN"

        The worker choice strategy to add.

        -
      • pool: IPool<Worker, Data, Response>

        The pool instance.

        -
      • Optional opts: WorkerChoiceStrategyOptions

        The worker choice strategy options.

        -

      Returns Map<"ROUND_ROBIN" | "LEAST_USED" | "LEAST_BUSY" | "LEAST_ELU" | "FAIR_SHARE" | "WEIGHTED_ROUND_ROBIN" | "INTERLEAVED_WEIGHTED_ROUND_ROBIN", IWorkerChoiceStrategy>

      The worker choice strategies.

      -
    • Executes the given worker choice strategy in the context algorithm.

      -

      Parameters

      • workerChoiceStrategy: "ROUND_ROBIN" | "LEAST_USED" | "LEAST_BUSY" | "LEAST_ELU" | "FAIR_SHARE" | "WEIGHTED_ROUND_ROBIN" | "INTERLEAVED_WEIGHTED_ROUND_ROBIN" = ...

        The worker choice strategy algorithm to execute.

        +
      • workerChoiceStrategies: (
            | "ROUND_ROBIN"
            | "LEAST_USED"
            | "LEAST_BUSY"
            | "LEAST_ELU"
            | "FAIR_SHARE"
            | "WEIGHTED_ROUND_ROBIN"
            | "INTERLEAVED_WEIGHTED_ROUND_ROBIN")[] = ...

        The worker choice strategies.

        +
      • Optionalopts: WorkerChoiceStrategyOptions

        The worker choice strategy options.

        +

      Returns WorkerChoiceStrategiesContext<Worker, Data, Response>

      [WorkerChoiceStrategies.ROUND_ROBIN]
      +
      + +

    Properties

    retriesCount: number

    The number of worker choice strategies execution retries.

    +

    Methods

    • Executes the given worker choice strategy in the context algorithm.

      +

      Parameters

      • workerChoiceStrategy:
            | "ROUND_ROBIN"
            | "LEAST_USED"
            | "LEAST_BUSY"
            | "LEAST_ELU"
            | "FAIR_SHARE"
            | "WEIGHTED_ROUND_ROBIN"
            | "INTERLEAVED_WEIGHTED_ROUND_ROBIN" = ...

        The worker choice strategy algorithm to execute.

      Returns number

      The key of the worker node.

      -

      Default Value

      this.defaultWorkerChoiceStrategy
      -
      -

      Throws

      https://nodejs.org/api/errors.html#class-error If after computed retries the worker node key is null or undefined.

      -
    • Removes a worker choice strategy from the context.

      -

      Parameters

      • workerChoiceStrategy: "ROUND_ROBIN" | "LEAST_USED" | "LEAST_BUSY" | "LEAST_ELU" | "FAIR_SHARE" | "WEIGHTED_ROUND_ROBIN" | "INTERLEAVED_WEIGHTED_ROUND_ROBIN"

        The worker choice strategy to remove.

        -

      Returns boolean

      true if the worker choice strategy is removed, false otherwise.

      -
    • Sets the default worker choice strategy to use in the context.

      -

      Parameters

      • workerChoiceStrategy: "ROUND_ROBIN" | "LEAST_USED" | "LEAST_BUSY" | "LEAST_ELU" | "FAIR_SHARE" | "WEIGHTED_ROUND_ROBIN" | "INTERLEAVED_WEIGHTED_ROUND_ROBIN"

        The default worker choice strategy to set.

        -
      • Optional opts: WorkerChoiceStrategyOptions

        The worker choice strategy options.

        -

      Returns void

    • Sets the default worker choice strategy to use in the context.

      +

      Parameters

      • workerChoiceStrategy:
            | "ROUND_ROBIN"
            | "LEAST_USED"
            | "LEAST_BUSY"
            | "LEAST_ELU"
            | "FAIR_SHARE"
            | "WEIGHTED_ROUND_ROBIN"
            | "INTERLEAVED_WEIGHTED_ROUND_ROBIN"

        The default worker choice strategy to set.

        +
      • Optionalopts: WorkerChoiceStrategyOptions

        The worker choice strategy options.

        +

      Returns void

    • Synchronizes the active worker choice strategies in the context with the given worker choice strategies.

      -

      Parameters

      • workerChoiceStrategies: Set<"ROUND_ROBIN" | "LEAST_USED" | "LEAST_BUSY" | "LEAST_ELU" | "FAIR_SHARE" | "WEIGHTED_ROUND_ROBIN" | "INTERLEAVED_WEIGHTED_ROUND_ROBIN">

        The worker choice strategies to synchronize.

        -
      • Optional opts: WorkerChoiceStrategyOptions

        The worker choice strategy options.

        -

      Returns void

    • Updates the worker node key in the active worker choice strategies in the context internals.

      +

    Returns void

    • Synchronizes the active worker choice strategies in the context with the given worker choice strategies.

      +

      Parameters

      • workerChoiceStrategies: Set<
            | "ROUND_ROBIN"
            | "LEAST_USED"
            | "LEAST_BUSY"
            | "LEAST_ELU"
            | "FAIR_SHARE"
            | "WEIGHTED_ROUND_ROBIN"
            | "INTERLEAVED_WEIGHTED_ROUND_ROBIN">

        The worker choice strategies to synchronize.

        +
      • Optionalopts: WorkerChoiceStrategyOptions

        The worker choice strategy options.

        +

      Returns void

    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/functions/availableParallelism.html b/docs/functions/availableParallelism.html index 5029c18f..24d3eb18 100644 --- a/docs/functions/availableParallelism.html +++ b/docs/functions/availableParallelism.html @@ -1,4 +1,4 @@ -availableParallelism | poolifier - v4.0.15

    Function availableParallelism

    • Returns safe host OS optimized estimate of the default amount of parallelism a pool should use. +availableParallelism | poolifier - v4.0.15

      Function availableParallelism

      Returns safe host OS optimized estimate of the default amount of parallelism a pool should use. Always returns a value greater than zero.

      -

      Returns number

      The host OS optimized maximum pool size.

      -
    \ No newline at end of file +
    • Returns number

      The host OS optimized maximum pool size.

      +
    \ No newline at end of file diff --git a/docs/hierarchy.html b/docs/hierarchy.html index b30a3651..49bb6e63 100644 --- a/docs/hierarchy.html +++ b/docs/hierarchy.html @@ -1 +1 @@ -poolifier - v4.0.15
    \ No newline at end of file +poolifier - v4.0.15
    \ No newline at end of file diff --git a/docs/index.html b/docs/index.html index cf4c8ff8..d6fb43d7 100644 --- a/docs/index.html +++ b/docs/index.html @@ -1,4 +1,4 @@ -poolifier - v4.0.15

    poolifier - v4.0.15

    Index

    Classes

    AbstractPool +poolifier - v4.0.15
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/interfaces/EventLoopUtilizationMeasurementStatistics.html b/docs/interfaces/EventLoopUtilizationMeasurementStatistics.html index 636884fd..4d5a6d99 100644 --- a/docs/interfaces/EventLoopUtilizationMeasurementStatistics.html +++ b/docs/interfaces/EventLoopUtilizationMeasurementStatistics.html @@ -1,5 +1,5 @@ -EventLoopUtilizationMeasurementStatistics | poolifier - v4.0.15

    Interface EventLoopUtilizationMeasurementStatisticsInternal

    Event loop utilization measurement statistics.

    -
    interface EventLoopUtilizationMeasurementStatistics {
        active: MeasurementStatistics;
        idle: MeasurementStatistics;
        utilization?: number;
    }

    Properties

    active +EventLoopUtilizationMeasurementStatistics | poolifier - v4.0.15

    Interface EventLoopUtilizationMeasurementStatisticsInternal

    Event loop utilization measurement statistics.

    +
    interface EventLoopUtilizationMeasurementStatistics {
        active: MeasurementStatistics;
        idle: MeasurementStatistics;
        utilization?: number;
    }

    Properties

    utilization?: number
    \ No newline at end of file +

    Properties

    utilization?: number
    \ No newline at end of file diff --git a/docs/interfaces/FixedPriorityQueueNode.html b/docs/interfaces/FixedPriorityQueueNode.html index 00b12a1f..933d91c8 100644 --- a/docs/interfaces/FixedPriorityQueueNode.html +++ b/docs/interfaces/FixedPriorityQueueNode.html @@ -1,5 +1,5 @@ -FixedPriorityQueueNode | poolifier - v4.0.15

    Interface FixedPriorityQueueNode<T>Internal

    Fixed priority queue node.

    +FixedPriorityQueueNode | poolifier - v4.0.15

    Interface FixedPriorityQueueNode<T>Internal

    Fixed priority queue node.

    interface FixedPriorityQueueNode<T> {
        data: T;
        priority: number;
    }

    Type Parameters

    • T

      Type of priority queue node data.

      -

    Properties

    Properties

    Properties

    data: T
    priority: number
    \ No newline at end of file +

    Properties

    data: T
    priority: number
    \ No newline at end of file diff --git a/docs/interfaces/IPool.html b/docs/interfaces/IPool.html index 356689c9..467df5ca 100644 --- a/docs/interfaces/IPool.html +++ b/docs/interfaces/IPool.html @@ -1,8 +1,8 @@ -IPool | poolifier - v4.0.15

    Interface IPool<Worker, Data, Response>

    Contract definition for a poolifier pool.

    -
    interface IPool<Worker, Data, Response> {
        addTaskFunction: ((name, fn) => Promise<boolean>);
        destroy: (() => Promise<void>);
        emitter?: EventEmitterAsyncResource;
        enableTasksQueue: ((enable, tasksQueueOptions?) => void);
        execute: ((data?, name?, transferList?) => Promise<Response>);
        hasTaskFunction: ((name) => boolean);
        info: PoolInfo;
        listTaskFunctionsProperties: (() => TaskFunctionProperties[]);
        mapExecute: ((data, name?, transferList?) => Promise<Response[]>);
        removeTaskFunction: ((name) => Promise<boolean>);
        setDefaultTaskFunction: ((name) => Promise<boolean>);
        setTasksQueueOptions: ((tasksQueueOptions) => void);
        setWorkerChoiceStrategy: ((workerChoiceStrategy, workerChoiceStrategyOptions?) => void);
        setWorkerChoiceStrategyOptions: ((workerChoiceStrategyOptions) => boolean);
        start: (() => void);
        workerNodes: IWorkerNode<Worker, Data>[];
    }

    Type Parameters

    Implemented by

    Properties

    addTaskFunction: ((name, fn) => Promise<boolean>)

    Adds a task function to this pool. +

    Properties

    addTaskFunction: ((name: string, fn: TaskFunction<Data, Response> | TaskFunctionObject<Data, Response>) => Promise<boolean>)

    Adds a task function to this pool. If a task function with the same name already exists, it will be overwritten.

    Type declaration

    Returns

    true if the task function was added, false otherwise.

    -

    Throws

    https://nodejs.org/api/errors.html#class-typeerror If the name parameter is not a string or an empty string.

    -

    Throws

    https://nodejs.org/api/errors.html#class-typeerror If the fn parameter is not a function or task function object.

    -
    destroy: (() => Promise<void>)

    Terminates all workers in this pool.

    -

    Type declaration

      • (): Promise<void>
      • Returns Promise<void>

    emitter?: EventEmitterAsyncResource

    Pool event emitter integrated with async resource. +

    Returns Promise<boolean>

    true if the task function was added, false otherwise.

    +

    https://nodejs.org/api/errors.html#class-typeerror If the name parameter is not a string or an empty string.

    +

    https://nodejs.org/api/errors.html#class-typeerror If the fn parameter is not a function or task function object.

    +
    destroy: (() => Promise<void>)

    Terminates all workers in this pool.

    +
    emitter?: EventEmitterAsyncResource

    Pool event emitter integrated with async resource. The async tracking tooling identifier is poolifier:<PoolType>-<WorkerType>-pool.

    Events that can currently be listened to:

      -
    • 'ready': Emitted when the number of workers created in the pool has reached the minimum size expected and are ready. If the pool is dynamic with a minimum number of workers is set to zero, this event is emitted when at least one dynamic worker is ready.
    • -
    • 'busy': Emitted when the number of workers created in the pool has reached the maximum size expected and are executing concurrently their tasks quota.
    • -
    • 'full': Emitted when the pool is dynamic and the number of workers created has reached the maximum size expected.
    • -
    • 'empty': Emitted when the pool is dynamic with a minimum number of workers set to zero and the number of workers has reached the minimum size expected.
    • -
    • 'destroy': Emitted when the pool is destroyed.
    • -
    • 'error': Emitted when an uncaught error occurs.
    • -
    • 'taskError': Emitted when an error occurs while executing a task.
    • -
    • 'backPressure': Emitted when all worker nodes have back pressure (i.e. their tasks queue is full: queue size >= maximum queue size).
    • +
    • 'ready': Emitted when the number of workers created in the pool has reached the minimum size expected and are ready. If the pool is dynamic with a minimum number of workers is set to zero, this event is emitted when at least one dynamic worker is ready.
    • +
    • 'busy': Emitted when the number of workers created in the pool has reached the maximum size expected and are executing concurrently their tasks quota.
    • +
    • 'full': Emitted when the pool is dynamic and the number of workers created has reached the maximum size expected.
    • +
    • 'empty': Emitted when the pool is dynamic with a minimum number of workers set to zero and the number of workers has reached the minimum size expected.
    • +
    • 'destroy': Emitted when the pool is destroyed.
    • +
    • 'error': Emitted when an uncaught error occurs.
    • +
    • 'taskError': Emitted when an error occurs while executing a task.
    • +
    • 'backPressure': Emitted when all worker nodes have back pressure (i.e. their tasks queue is full: queue size >= maximum queue size).
    -
    enableTasksQueue: ((enable, tasksQueueOptions?) => void)

    Enables/disables the worker node tasks queue in this pool.

    +
    enableTasksQueue: ((enable: boolean, tasksQueueOptions?: TasksQueueOptions) => void)

    Enables/disables the worker node tasks queue in this pool.

    Type declaration

      • (enable, tasksQueueOptions?): void
      • Parameters

        • enable: boolean

          Whether to enable or disable the worker node tasks queue.

          -
        • Optional tasksQueueOptions: TasksQueueOptions

          The worker node tasks queue options.

          -

        Returns void

    execute: ((data?, name?, transferList?) => Promise<Response>)

    Executes the specified function in the worker constructor with the task data input parameter.

    -

    Type declaration

      • (data?, name?, transferList?): Promise<Response>
      • Parameters

        • Optional data: Data

          The optional task input data for the specified task function. This can only be structured-cloneable data.

          -
        • Optional name: string

          The optional name of the task function to execute. If not specified, the default task function will be executed.

          -
        • Optional transferList: readonly TransferListItem[]

          An optional array of transferable objects to transfer ownership of. Ownership of the transferred objects is given to the chosen pool's worker_threads worker and they should not be used in the main thread afterwards.

          -

        Returns Promise<Response>

    Returns

    Promise with a task function response that will be fulfilled when the task is completed.

    -
    hasTaskFunction: ((name) => boolean)

    Whether the specified task function exists in this pool.

    +
  • OptionaltasksQueueOptions: TasksQueueOptions

    The worker node tasks queue options.

    +
  • Returns void

    execute: ((data?: Data, name?: string, transferList?: readonly TransferListItem[]) => Promise<Response>)

    Executes the specified function in the worker constructor with the task data input parameter.

    +

    Type declaration

      • (data?, name?, transferList?): Promise<Response>
      • Parameters

        • Optionaldata: Data

          The optional task input data for the specified task function. This can only be structured-cloneable data.

          +
        • Optionalname: string

          The optional name of the task function to execute. If not specified, the default task function will be executed.

          +
        • OptionaltransferList: readonly TransferListItem[]

          An optional array of transferable objects to transfer ownership of. Ownership of the transferred objects is given to the chosen pool's worker_threads worker and they should not be used in the main thread afterwards.

          +

        Returns Promise<Response>

        Promise with a task function response that will be fulfilled when the task is completed.

        +
    hasTaskFunction: ((name: string) => boolean)

    Whether the specified task function exists in this pool.

    Type declaration

      • (name): boolean
      • Parameters

        • name: string

          The name of the task function.

          -

        Returns boolean

    Returns

    true if the task function exists, false otherwise.

    -
    info: PoolInfo

    Pool information.

    -
    listTaskFunctionsProperties: (() => TaskFunctionProperties[])

    Lists the properties of task functions available in this pool.

    -

    Type declaration

    Returns

    The properties of task functions available in this pool.

    -
    mapExecute: ((data, name?, transferList?) => Promise<Response[]>)

    Executes the specified function in the worker constructor with the tasks data iterable input parameter.

    +

    Returns boolean

    true if the task function exists, false otherwise.

    +
    info: PoolInfo

    Pool information.

    +
    listTaskFunctionsProperties: (() => TaskFunctionProperties[])

    Lists the properties of task functions available in this pool.

    +

    Type declaration

    mapExecute: ((data: Iterable<Data>, name?: string, transferList?: readonly TransferListItem[]) => Promise<Response[]>)

    Executes the specified function in the worker constructor with the tasks data iterable input parameter.

    Type declaration

      • (data, name?, transferList?): Promise<Response[]>
      • Parameters

        • data: Iterable<Data>

          The tasks iterable input data for the specified task function. This can only be an iterable of structured-cloneable data.

          -
        • Optional name: string

          The optional name of the task function to execute. If not specified, the default task function will be executed.

          -
        • Optional transferList: readonly TransferListItem[]

          An optional array of transferable objects to transfer ownership of. Ownership of the transferred objects is given to the chosen pool's worker_threads worker and they should not be used in the main thread afterwards.

          -

        Returns Promise<Response[]>

    Returns

    Promise with an array of task function responses that will be fulfilled when the tasks are completed.

    -
    removeTaskFunction: ((name) => Promise<boolean>)

    Removes a task function from this pool.

    +
  • Optionalname: string

    The optional name of the task function to execute. If not specified, the default task function will be executed.

    +
  • OptionaltransferList: readonly TransferListItem[]

    An optional array of transferable objects to transfer ownership of. Ownership of the transferred objects is given to the chosen pool's worker_threads worker and they should not be used in the main thread afterwards.

    +
  • Returns Promise<Response[]>

    Promise with an array of task function responses that will be fulfilled when the tasks are completed.

    +
    removeTaskFunction: ((name: string) => Promise<boolean>)

    Removes a task function from this pool.

    Type declaration

      • (name): Promise<boolean>
      • Parameters

        • name: string

          The name of the task function.

          -

        Returns Promise<boolean>

    Returns

    true if the task function was removed, false otherwise.

    -
    setDefaultTaskFunction: ((name) => Promise<boolean>)

    Sets the default task function in this pool.

    +

    Returns Promise<boolean>

    true if the task function was removed, false otherwise.

    +
    setDefaultTaskFunction: ((name: string) => Promise<boolean>)

    Sets the default task function in this pool.

    Type declaration

      • (name): Promise<boolean>
      • Parameters

        • name: string

          The name of the task function.

          -

        Returns Promise<boolean>

    Returns

    true if the default task function was set, false otherwise.

    -
    setTasksQueueOptions: ((tasksQueueOptions) => void)

    Sets the worker node tasks queue options in this pool.

    +

    Returns Promise<boolean>

    true if the default task function was set, false otherwise.

    +
    setTasksQueueOptions: ((tasksQueueOptions: TasksQueueOptions) => void)

    Sets the worker node tasks queue options in this pool.

    Type declaration

      • (tasksQueueOptions): void
      • Parameters

        Returns void

    setWorkerChoiceStrategy: ((workerChoiceStrategy, workerChoiceStrategyOptions?) => void)

    Sets the default worker choice strategy in this pool.

    -

    Type declaration

      • (workerChoiceStrategy, workerChoiceStrategyOptions?): void
      • Parameters

        • workerChoiceStrategy: "ROUND_ROBIN" | "LEAST_USED" | "LEAST_BUSY" | "LEAST_ELU" | "FAIR_SHARE" | "WEIGHTED_ROUND_ROBIN" | "INTERLEAVED_WEIGHTED_ROUND_ROBIN"

          The default worker choice strategy.

          -
        • Optional workerChoiceStrategyOptions: WorkerChoiceStrategyOptions

          The worker choice strategy options.

          -

        Returns void

    setWorkerChoiceStrategyOptions: ((workerChoiceStrategyOptions) => boolean)

    Sets the worker choice strategy options in this pool.

    +

    Returns void

    setWorkerChoiceStrategy: ((workerChoiceStrategy:
        | "ROUND_ROBIN"
        | "LEAST_USED"
        | "LEAST_BUSY"
        | "LEAST_ELU"
        | "FAIR_SHARE"
        | "WEIGHTED_ROUND_ROBIN"
        | "INTERLEAVED_WEIGHTED_ROUND_ROBIN", workerChoiceStrategyOptions?: WorkerChoiceStrategyOptions) => void)

    Sets the default worker choice strategy in this pool.

    +

    Type declaration

      • (workerChoiceStrategy, workerChoiceStrategyOptions?): void
      • Parameters

        • workerChoiceStrategy:
              | "ROUND_ROBIN"
              | "LEAST_USED"
              | "LEAST_BUSY"
              | "LEAST_ELU"
              | "FAIR_SHARE"
              | "WEIGHTED_ROUND_ROBIN"
              | "INTERLEAVED_WEIGHTED_ROUND_ROBIN"

          The default worker choice strategy.

          +
        • OptionalworkerChoiceStrategyOptions: WorkerChoiceStrategyOptions

          The worker choice strategy options.

          +

        Returns void

    setWorkerChoiceStrategyOptions: ((workerChoiceStrategyOptions: WorkerChoiceStrategyOptions) => boolean)

    Sets the worker choice strategy options in this pool.

    Type declaration

      • (workerChoiceStrategyOptions): boolean
      • Parameters

        Returns boolean

    Returns

    true if the worker choice strategy options were set, false otherwise.

    -
    start: (() => void)

    Starts the minimum number of workers in this pool.

    -

    Type declaration

      • (): void
      • Returns void

    workerNodes: IWorkerNode<Worker, Data>[]

    Pool worker nodes.

    -
    \ No newline at end of file +

    Returns boolean

    true if the worker choice strategy options were set, false otherwise.

    +
    start: (() => void)

    Starts the minimum number of workers in this pool.

    +
    workerNodes: IWorkerNode<Worker, Data>[]

    Pool worker nodes.

    +
    \ No newline at end of file diff --git a/docs/interfaces/IWorker.html b/docs/interfaces/IWorker.html index 00b6ccfe..13f59f41 100644 --- a/docs/interfaces/IWorker.html +++ b/docs/interfaces/IWorker.html @@ -1,5 +1,5 @@ -IWorker | poolifier - v4.0.15

    Interface IWorker

    Worker interface.

    -
    interface IWorker {
        disconnect?: (() => void);
        id?: number;
        kill?: ((signal?) => void);
        on: ((event, handler) => this);
        once: ((event, handler) => this);
        terminate?: (() => Promise<number>);
        threadId?: number;
        unref?: (() => void);
        [captureRejectionSymbol]?<K>(error, event, ...args): void;
        addListener<K>(eventName, listener): this;
        emit<K>(eventName, ...args): boolean;
        eventNames(): (string | symbol)[];
        getMaxListeners(): number;
        listenerCount<K>(eventName, listener?): number;
        listeners<K>(eventName): Function[];
        off<K>(eventName, listener): this;
        prependListener<K>(eventName, listener): this;
        prependOnceListener<K>(eventName, listener): this;
        rawListeners<K>(eventName): Function[];
        removeAllListeners(eventName?): this;
        removeListener<K>(eventName, listener): this;
        setMaxListeners(n): this;
    }

    Hierarchy

    • EventEmitter
      • IWorker

    Properties

    disconnect? +IWorker | poolifier - v4.0.15

    Interface IWorker

    Worker interface.

    +
    interface IWorker {
        disconnect?: (() => void);
        id?: number;
        kill?: ((signal?: string) => void);
        on: ((event: string, handler: EventHandler<IWorker>) => this);
        once: ((event: string, handler: EventHandler<IWorker>) => this);
        terminate?: (() => Promise<number>);
        threadId?: number;
        unref?: (() => void);
        [captureRejectionSymbol]?<K>(error: Error, event: string | symbol, ...args: AnyRest): void;
        addListener<K>(eventName: string | symbol, listener: ((...args: any[]) => void)): this;
        emit<K>(eventName: string | symbol, ...args: AnyRest): boolean;
        eventNames(): (string | symbol)[];
        getMaxListeners(): number;
        listenerCount<K>(eventName: string | symbol, listener?: Function): number;
        listeners<K>(eventName: string | symbol): Function[];
        off<K>(eventName: string | symbol, listener: ((...args: any[]) => void)): this;
        prependListener<K>(eventName: string | symbol, listener: ((...args: any[]) => void)): this;
        prependOnceListener<K>(eventName: string | symbol, listener: ((...args: any[]) => void)): this;
        rawListeners<K>(eventName: string | symbol): Function[];
        removeAllListeners(eventName?: string | symbol): this;
        removeListener<K>(eventName: string | symbol, listener: ((...args: any[]) => void)): this;
        setMaxListeners(n: number): this;
    }

    Hierarchy

    • EventEmitter
      • IWorker

    Properties

    disconnect?: (() => void)

    Cluster worker disconnect.

    -

    Type declaration

      • (): void
      • Returns void

    id?: number

    Cluster worker id.

    -
    kill?: ((signal?) => void)

    Cluster worker kill.

    -

    Type declaration

      • (signal?): void
      • Parameters

        • Optional signal: string

        Returns void

    on: ((event, handler) => this)

    Registers an event handler.

    +

    Properties

    disconnect?: (() => void)

    Cluster worker disconnect.

    +
    id?: number

    Cluster worker id.

    +
    kill?: ((signal?: string) => void)

    Cluster worker kill.

    +
    on: ((event: string, handler: EventHandler<IWorker>) => this)

    Registers an event handler.

    Type declaration

      • (event, handler): this
      • Parameters

        Returns this

    once: ((event, handler) => this)

    Registers once an event handler.

    +

    Returns this

    once: ((event: string, handler: EventHandler<IWorker>) => this)

    Registers once an event handler.

    Type declaration

      • (event, handler): this
      • Parameters

        Returns this

    terminate?: (() => Promise<number>)

    Stop all JavaScript execution in the worker thread as soon as possible. -Returns a Promise for the exit code that is fulfilled when the 'exit' event is emitted.

    -

    Type declaration

      • (): Promise<number>
      • Returns Promise<number>

    threadId?: number

    Worker thread worker id.

    -
    unref?: (() => void)

    Calling unref() on a worker allows the thread to exit if this is the only +

    Returns this

    terminate?: (() => Promise<number>)

    Stop all JavaScript execution in the worker thread as soon as possible. +Returns a Promise for the exit code that is fulfilled when the 'exit' event is emitted.

    +
    threadId?: number

    Worker thread worker id.

    +
    unref?: (() => void)

    Calling unref() on a worker allows the thread to exit if this is the only active handle in the event system. If the worker is already unref()ed callingunref() again has no effect.

    -

    Type declaration

      • (): void
      • Returns void

    Since

    v10.5.0

    -

    Methods

    • Type Parameters

      • K

      Parameters

      • error: Error
      • event: string | symbol
      • Rest ...args: AnyRest

      Returns void

    • Alias for emitter.on(eventName, listener).

      -

      Type Parameters

      • K

      Parameters

      • eventName: string | symbol
      • listener: ((...args) => void)
          • (...args): void
          • Parameters

            • Rest ...args: any[]

            Returns void

      Returns this

      Since

      v0.1.26

      -
    • Synchronously calls each of the listeners registered for the event named eventName, in the order they were registered, passing the supplied arguments +

      v10.5.0

      +

    Methods

    • Type Parameters

      • K

      Parameters

      • error: Error
      • event: string | symbol
      • Rest...args: AnyRest

      Returns void

    • Alias for emitter.on(eventName, listener).

      +

      Type Parameters

      • K

      Parameters

      • eventName: string | symbol
      • listener: ((...args: any[]) => void)
          • (...args): void
          • Parameters

            • Rest...args: any[]

            Returns void

      Returns this

      v0.1.26

      +
    • Synchronously calls each of the listeners registered for the event named eventName, in the order they were registered, passing the supplied arguments to each.

      Returns true if the event had listeners, false otherwise.

      -
      import { EventEmitter } from 'node:events';
      const myEmitter = new EventEmitter();

      // First listener
      myEmitter.on('event', function firstListener() {
      console.log('Helloooo! first listener');
      });
      // Second listener
      myEmitter.on('event', function secondListener(arg1, arg2) {
      console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
      });
      // Third listener
      myEmitter.on('event', function thirdListener(...args) {
      const parameters = args.join(', ');
      console.log(`event with parameters ${parameters} in third listener`);
      });

      console.log(myEmitter.listeners('event'));

      myEmitter.emit('event', 1, 2, 3, 4, 5);

      // Prints:
      // [
      // [Function: firstListener],
      // [Function: secondListener],
      // [Function: thirdListener]
      // ]
      // Helloooo! first listener
      // event with parameters 1, 2 in second listener
      // event with parameters 1, 2, 3, 4, 5 in third listener -
      -

      Type Parameters

      • K

      Parameters

      • eventName: string | symbol
      • Rest ...args: AnyRest

      Returns boolean

      Since

      v0.1.26

      -
    • Returns an array listing the events for which the emitter has registered +

      import { EventEmitter } from 'node:events';
      const myEmitter = new EventEmitter();

      // First listener
      myEmitter.on('event', function firstListener() {
      console.log('Helloooo! first listener');
      });
      // Second listener
      myEmitter.on('event', function secondListener(arg1, arg2) {
      console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
      });
      // Third listener
      myEmitter.on('event', function thirdListener(...args) {
      const parameters = args.join(', ');
      console.log(`event with parameters ${parameters} in third listener`);
      });

      console.log(myEmitter.listeners('event'));

      myEmitter.emit('event', 1, 2, 3, 4, 5);

      // Prints:
      // [
      // [Function: firstListener],
      // [Function: secondListener],
      // [Function: thirdListener]
      // ]
      // Helloooo! first listener
      // event with parameters 1, 2 in second listener
      // event with parameters 1, 2, 3, 4, 5 in third listener +
      + +

      Type Parameters

      • K

      Parameters

      • eventName: string | symbol
      • Rest...args: AnyRest

      Returns boolean

      v0.1.26

      +
    • Returns an array listing the events for which the emitter has registered listeners. The values in the array are strings or Symbols.

      -
      import { EventEmitter } from 'node:events';

      const myEE = new EventEmitter();
      myEE.on('foo', () => {});
      myEE.on('bar', () => {});

      const sym = Symbol('symbol');
      myEE.on(sym, () => {});

      console.log(myEE.eventNames());
      // Prints: [ 'foo', 'bar', Symbol(symbol) ] -
      -

      Returns (string | symbol)[]

      Since

      v6.0.0

      -
    • Returns the current max listener value for the EventEmitter which is either +

      import { EventEmitter } from 'node:events';

      const myEE = new EventEmitter();
      myEE.on('foo', () => {});
      myEE.on('bar', () => {});

      const sym = Symbol('symbol');
      myEE.on(sym, () => {});

      console.log(myEE.eventNames());
      // Prints: [ 'foo', 'bar', Symbol(symbol) ] +
      + +

      Returns (string | symbol)[]

      v6.0.0

      +
    • Returns the current max listener value for the EventEmitter which is either set by emitter.setMaxListeners(n) or defaults to defaultMaxListeners.

      -

      Returns number

      Since

      v1.0.0

      -
    • Returns the number of listeners listening for the event named eventName. +

      Returns number

      v1.0.0

      +
    • Returns the number of listeners listening for the event named eventName. If listener is provided, it will return how many times the listener is found in the list of the listeners of the event.

      Type Parameters

      • K

      Parameters

      • eventName: string | symbol

        The name of the event being listened for

        -
      • Optional listener: Function

        The event handler function

        -

      Returns number

      Since

      v3.2.0

      -
    • Returns a copy of the array of listeners for the event named eventName.

      -
      server.on('connection', (stream) => {
      console.log('someone connected!');
      });
      console.log(util.inspect(server.listeners('connection')));
      // Prints: [ [Function] ] -
      -

      Type Parameters

      • K

      Parameters

      • eventName: string | symbol

      Returns Function[]

      Since

      v0.1.26

      -
    • Alias for emitter.removeListener().

      -

      Type Parameters

      • K

      Parameters

      • eventName: string | symbol
      • listener: ((...args) => void)
          • (...args): void
          • Parameters

            • Rest ...args: any[]

            Returns void

      Returns this

      Since

      v10.0.0

      -
    • Adds the listener function to the beginning of the listeners array for the +

    • Optionallistener: Function

      The event handler function

      +

    Returns number

    v3.2.0

    +
    • Returns a copy of the array of listeners for the event named eventName.

      +
      server.on('connection', (stream) => {
      console.log('someone connected!');
      });
      console.log(util.inspect(server.listeners('connection')));
      // Prints: [ [Function] ] +
      + +

      Type Parameters

      • K

      Parameters

      • eventName: string | symbol

      Returns Function[]

      v0.1.26

      +
    • Alias for emitter.removeListener().

      +

      Type Parameters

      • K

      Parameters

      • eventName: string | symbol
      • listener: ((...args: any[]) => void)
          • (...args): void
          • Parameters

            • Rest...args: any[]

            Returns void

      Returns this

      v10.0.0

      +
    • Adds the listener function to the beginning of the listeners array for the event named eventName. No checks are made to see if the listener has already been added. Multiple calls passing the same combination of eventName and listener will result in the listener being added, and called, multiple times.

      -
      server.prependListener('connection', (stream) => {
      console.log('someone connected!');
      }); -
      +
      server.prependListener('connection', (stream) => {
      console.log('someone connected!');
      }); +
      +

      Returns a reference to the EventEmitter, so that calls can be chained.

      Type Parameters

      • K

      Parameters

      • eventName: string | symbol

        The name of the event.

        -
      • listener: ((...args) => void)

        The callback function

        -
          • (...args): void
          • Parameters

            • Rest ...args: any[]

            Returns void

      Returns this

      Since

      v6.0.0

      -
    • Adds a one-timelistener function for the event named eventName to the beginning of the listeners array. The next time eventName is triggered, this +

    • listener: ((...args: any[]) => void)

      The callback function

      +
        • (...args): void
        • Parameters

          • Rest...args: any[]

          Returns void

    Returns this

    v6.0.0

    +
    • Adds a one-timelistener function for the event named eventName to the beginning of the listeners array. The next time eventName is triggered, this listener is removed, and then invoked.

      -
      server.prependOnceListener('connection', (stream) => {
      console.log('Ah, we have our first user!');
      }); -
      +
      server.prependOnceListener('connection', (stream) => {
      console.log('Ah, we have our first user!');
      }); +
      +

      Returns a reference to the EventEmitter, so that calls can be chained.

      Type Parameters

      • K

      Parameters

      • eventName: string | symbol

        The name of the event.

        -
      • listener: ((...args) => void)

        The callback function

        -
          • (...args): void
          • Parameters

            • Rest ...args: any[]

            Returns void

      Returns this

      Since

      v6.0.0

      -
    • Returns a copy of the array of listeners for the event named eventName, +

    • listener: ((...args: any[]) => void)

      The callback function

      +
        • (...args): void
        • Parameters

          • Rest...args: any[]

          Returns void

    Returns this

    v6.0.0

    +
    • Returns a copy of the array of listeners for the event named eventName, including any wrappers (such as those created by .once()).

      -
      import { EventEmitter } from 'node:events';
      const emitter = new EventEmitter();
      emitter.once('log', () => console.log('log once'));

      // Returns a new Array with a function `onceWrapper` which has a property
      // `listener` which contains the original listener bound above
      const listeners = emitter.rawListeners('log');
      const logFnWrapper = listeners[0];

      // Logs "log once" to the console and does not unbind the `once` event
      logFnWrapper.listener();

      // Logs "log once" to the console and removes the listener
      logFnWrapper();

      emitter.on('log', () => console.log('log persistently'));
      // Will return a new Array with a single function bound by `.on()` above
      const newListeners = emitter.rawListeners('log');

      // Logs "log persistently" twice
      newListeners[0]();
      emitter.emit('log'); -
      -

      Type Parameters

      • K

      Parameters

      • eventName: string | symbol

      Returns Function[]

      Since

      v9.4.0

      -
    • Removes all listeners, or those of the specified eventName.

      +
      import { EventEmitter } from 'node:events';
      const emitter = new EventEmitter();
      emitter.once('log', () => console.log('log once'));

      // Returns a new Array with a function `onceWrapper` which has a property
      // `listener` which contains the original listener bound above
      const listeners = emitter.rawListeners('log');
      const logFnWrapper = listeners[0];

      // Logs "log once" to the console and does not unbind the `once` event
      logFnWrapper.listener();

      // Logs "log once" to the console and removes the listener
      logFnWrapper();

      emitter.on('log', () => console.log('log persistently'));
      // Will return a new Array with a single function bound by `.on()` above
      const newListeners = emitter.rawListeners('log');

      // Logs "log persistently" twice
      newListeners[0]();
      emitter.emit('log'); +
      + +

      Type Parameters

      • K

      Parameters

      • eventName: string | symbol

      Returns Function[]

      v9.4.0

      +
    • Removes all listeners, or those of the specified eventName.

      It is bad practice to remove listeners added elsewhere in the code, particularly when the EventEmitter instance was created by some other component or module (e.g. sockets or file streams).

      Returns a reference to the EventEmitter, so that calls can be chained.

      -

      Parameters

      • Optional eventName: string | symbol

      Returns this

      Since

      v0.1.26

      -
    • Removes the specified listener from the listener array for the event named eventName.

      -
      const callback = (stream) => {
      console.log('someone connected!');
      };
      server.on('connection', callback);
      // ...
      server.removeListener('connection', callback); -
      +

      Parameters

      • OptionaleventName: string | symbol

      Returns this

      v0.1.26

      +
    • Removes the specified listener from the listener array for the event named eventName.

      +
      const callback = (stream) => {
      console.log('someone connected!');
      };
      server.on('connection', callback);
      // ...
      server.removeListener('connection', callback); +
      +

      removeListener() will remove, at most, one instance of a listener from the listener array. If any single listener has been added multiple times to the listener array for the specified eventName, then removeListener() must be @@ -103,8 +110,9 @@ called multiple times to remove each instance.

      Once an event is emitted, all listeners attached to it at the time of emitting are called in order. This implies that any removeListener() or removeAllListeners() calls after emitting and before the last listener finishes execution will not remove them fromemit() in progress. Subsequent events behave as expected.

      -
      import { EventEmitter } from 'node:events';
      class MyEmitter extends EventEmitter {}
      const myEmitter = new MyEmitter();

      const callbackA = () => {
      console.log('A');
      myEmitter.removeListener('event', callbackB);
      };

      const callbackB = () => {
      console.log('B');
      };

      myEmitter.on('event', callbackA);

      myEmitter.on('event', callbackB);

      // callbackA removes listener callbackB but it will still be called.
      // Internal listener array at time of emit [callbackA, callbackB]
      myEmitter.emit('event');
      // Prints:
      // A
      // B

      // callbackB is now removed.
      // Internal listener array [callbackA]
      myEmitter.emit('event');
      // Prints:
      // A -
      +
      import { EventEmitter } from 'node:events';
      class MyEmitter extends EventEmitter {}
      const myEmitter = new MyEmitter();

      const callbackA = () => {
      console.log('A');
      myEmitter.removeListener('event', callbackB);
      };

      const callbackB = () => {
      console.log('B');
      };

      myEmitter.on('event', callbackA);

      myEmitter.on('event', callbackB);

      // callbackA removes listener callbackB but it will still be called.
      // Internal listener array at time of emit [callbackA, callbackB]
      myEmitter.emit('event');
      // Prints:
      // A
      // B

      // callbackB is now removed.
      // Internal listener array [callbackA]
      myEmitter.emit('event');
      // Prints:
      // A +
      +

      Because listeners are managed using an internal array, calling this will change the position indices of any listener registered after the listener being removed. This will not impact the order in which listeners are called, @@ -112,15 +120,16 @@ but it means that any copies of the listener array as returned by the emitter.listeners() method will need to be recreated.

      When a single function has been added as a handler multiple times for a single event (as in the example below), removeListener() will remove the most -recently added instance. In the example the once('ping') listener is removed:

      -
      import { EventEmitter } from 'node:events';
      const ee = new EventEmitter();

      function pong() {
      console.log('pong');
      }

      ee.on('ping', pong);
      ee.once('ping', pong);
      ee.removeListener('ping', pong);

      ee.emit('ping');
      ee.emit('ping'); -
      +recently added instance. In the example the once('ping') listener is removed:

      +
      import { EventEmitter } from 'node:events';
      const ee = new EventEmitter();

      function pong() {
      console.log('pong');
      }

      ee.on('ping', pong);
      ee.once('ping', pong);
      ee.removeListener('ping', pong);

      ee.emit('ping');
      ee.emit('ping'); +
      +

      Returns a reference to the EventEmitter, so that calls can be chained.

      -

      Type Parameters

      • K

      Parameters

      • eventName: string | symbol
      • listener: ((...args) => void)
          • (...args): void
          • Parameters

            • Rest ...args: any[]

            Returns void

      Returns this

      Since

      v0.1.26

      -
    • By default EventEmitters will print a warning if more than 10 listeners are +

      Type Parameters

      • K

      Parameters

      • eventName: string | symbol
      • listener: ((...args: any[]) => void)
          • (...args): void
          • Parameters

            • Rest...args: any[]

            Returns void

      Returns this

      v0.1.26

      +
    • By default EventEmitters will print a warning if more than 10 listeners are added for a particular event. This is a useful default that helps finding memory leaks. The emitter.setMaxListeners() method allows the limit to be modified for this specific EventEmitter instance. The value can be set to Infinity (or 0) to indicate an unlimited number of listeners.

      Returns a reference to the EventEmitter, so that calls can be chained.

      -

      Parameters

      • n: number

      Returns this

      Since

      v0.3.5

      -
    \ No newline at end of file +

    Parameters

    • n: number

    Returns this

    v0.3.5

    +
    \ No newline at end of file diff --git a/docs/interfaces/IWorkerChoiceStrategy.html b/docs/interfaces/IWorkerChoiceStrategy.html index dea03eb8..78d4e58e 100644 --- a/docs/interfaces/IWorkerChoiceStrategy.html +++ b/docs/interfaces/IWorkerChoiceStrategy.html @@ -1,25 +1,25 @@ -IWorkerChoiceStrategy | poolifier - v4.0.15

    Interface IWorkerChoiceStrategyInternal

    Worker choice strategy interface.

    -
    interface IWorkerChoiceStrategy {
        choose: (() => undefined | number);
        remove: ((workerNodeKey) => boolean);
        reset: (() => boolean);
        setOptions: ((opts) => void);
        strategyPolicy: StrategyPolicy;
        taskStatisticsRequirements: TaskStatisticsRequirements;
        update: ((workerNodeKey) => boolean);
    }

    Properties

    choose +IWorkerChoiceStrategy | poolifier - v4.0.15

    Interface IWorkerChoiceStrategyInternal

    Worker choice strategy interface.

    +
    interface IWorkerChoiceStrategy {
        choose: (() => undefined | number);
        remove: ((workerNodeKey: number) => boolean);
        reset: (() => boolean);
        setOptions: ((opts: undefined | WorkerChoiceStrategyOptions) => void);
        strategyPolicy: StrategyPolicy;
        taskStatisticsRequirements: TaskStatisticsRequirements;
        update: ((workerNodeKey: number) => boolean);
    }

    Properties

    choose: (() => undefined | number)

    Chooses a worker node in the pool and returns its key. +

    Properties

    choose: (() => undefined | number)

    Chooses a worker node in the pool and returns its key. If no worker nodes are not eligible, undefined is returned. If undefined is returned, the caller retry.

    -

    Type declaration

      • (): undefined | number
      • Returns undefined | number

    Returns

    The worker node key or undefined.

    -
    remove: ((workerNodeKey) => boolean)

    Removes the worker node key from strategy internals.

    +

    Type declaration

      • (): undefined | number
      • Returns undefined | number

        The worker node key or undefined.

        +
    remove: ((workerNodeKey: number) => boolean)

    Removes the worker node key from strategy internals.

    Type declaration

      • (workerNodeKey): boolean
      • Parameters

        • workerNodeKey: number

          The worker node key.

          -

        Returns boolean

    Returns

    true if the worker node key is removed, false otherwise.

    -
    reset: (() => boolean)

    Resets strategy internals.

    -

    Type declaration

      • (): boolean
      • Returns boolean

    Returns

    true if the reset is successful, false otherwise.

    -
    setOptions: ((opts) => void)

    Sets the worker choice strategy options.

    +

    Returns boolean

    true if the worker node key is removed, false otherwise.

    +
    reset: (() => boolean)

    Resets strategy internals.

    +

    Type declaration

      • (): boolean
      • Returns boolean

        true if the reset is successful, false otherwise.

        +
    setOptions: ((opts: undefined | WorkerChoiceStrategyOptions) => void)

    Sets the worker choice strategy options.

    Type declaration

    strategyPolicy: StrategyPolicy

    Strategy policy.

    -
    taskStatisticsRequirements: TaskStatisticsRequirements

    Tasks statistics requirements.

    -
    update: ((workerNodeKey) => boolean)

    Updates the worker node key strategy internals. +

    Returns void

    strategyPolicy: StrategyPolicy

    Strategy policy.

    +
    taskStatisticsRequirements: TaskStatisticsRequirements

    Tasks statistics requirements.

    +
    update: ((workerNodeKey: number) => boolean)

    Updates the worker node key strategy internals. This is called after a task has been executed on a worker node.

    -

    Type declaration

      • (workerNodeKey): boolean
      • Parameters

        • workerNodeKey: number

        Returns boolean

    Returns

    true if the update is successful, false otherwise.

    -
    \ No newline at end of file +

    Type declaration

      • (workerNodeKey): boolean
      • Parameters

        • workerNodeKey: number

        Returns boolean

        true if the update is successful, false otherwise.

        +
    \ No newline at end of file diff --git a/docs/interfaces/IWorkerNode.html b/docs/interfaces/IWorkerNode.html index 634c9d4c..93300af6 100644 --- a/docs/interfaces/IWorkerNode.html +++ b/docs/interfaces/IWorkerNode.html @@ -1,7 +1,7 @@ -IWorkerNode | poolifier - v4.0.15

    Interface IWorkerNode<Worker, Data>Internal

    Worker node interface.

    -
    interface IWorkerNode<Worker, Data> {
        clearTasksQueue: (() => void);
        deleteTaskFunctionWorkerUsage: ((name) => boolean);
        dequeueLastPrioritizedTask: (() => undefined | Task<Data>);
        dequeueTask: ((bucket?) => undefined | Task<Data>);
        enqueueTask: ((task) => number);
        getTaskFunctionWorkerUsage: ((name) => undefined | WorkerUsage);
        hasBackPressure: (() => boolean);
        info: WorkerInfo;
        messageChannel?: MessageChannel;
        registerOnceWorkerEventHandler: ((event, handler) => void);
        registerWorkerEventHandler: ((event, handler) => void);
        setTasksQueuePriority: ((enablePriority) => void);
        strategyData?: StrategyData;
        tasksQueueBackPressureSize: number;
        tasksQueueSize: (() => number);
        terminate: (() => Promise<void>);
        usage: WorkerUsage;
        worker: Worker;
        [captureRejectionSymbol]?<K>(error, event, ...args): void;
        addListener<K>(eventName, listener): this;
        emit<K>(eventName, ...args): boolean;
        eventNames(): (string | symbol)[];
        getMaxListeners(): number;
        listenerCount<K>(eventName, listener?): number;
        listeners<K>(eventName): Function[];
        off<K>(eventName, listener): this;
        on<K>(eventName, listener): this;
        once<K>(eventName, listener): this;
        prependListener<K>(eventName, listener): this;
        prependOnceListener<K>(eventName, listener): this;
        rawListeners<K>(eventName): Function[];
        removeAllListeners(eventName?): this;
        removeListener<K>(eventName, listener): this;
        setMaxListeners(n): this;
    }

    Type Parameters

    Hierarchy

    • EventEmitter
      • IWorkerNode

    Properties

    clearTasksQueue: (() => void)

    Clears tasks queue.

    -

    Type declaration

      • (): void
      • Returns void

    deleteTaskFunctionWorkerUsage: ((name) => boolean)

    Deletes task function worker usage statistics.

    +

    Properties

    clearTasksQueue: (() => void)

    Clears tasks queue.

    +
    deleteTaskFunctionWorkerUsage: ((name: string) => boolean)

    Deletes task function worker usage statistics.

    Type declaration

      • (name): boolean
      • Parameters

        • name: string

          The task function name.

          -

        Returns boolean

    Returns

    true if the task function worker usage statistics were deleted, false otherwise.

    -
    dequeueLastPrioritizedTask: (() => undefined | Task<Data>)

    Dequeue last prioritized task.

    -

    Type declaration

    Returns

    The dequeued task.

    -
    dequeueTask: ((bucket?) => undefined | Task<Data>)

    Dequeue task.

    -

    Type declaration

      • (bucket?): undefined | Task<Data>
      • Parameters

        • Optional bucket: number

          The prioritized bucket to dequeue from.

          -

        Returns undefined | Task<Data>

    Default Value

    0
    -
    -

    Returns

    The dequeued task.

    -
    enqueueTask: ((task) => number)

    Enqueue task.

    +

    Returns boolean

    true if the task function worker usage statistics were deleted, false otherwise.

    +
    dequeueLastPrioritizedTask: (() => undefined | Task<Data>)

    Dequeue last prioritized task.

    +

    Type declaration

    dequeueTask: ((bucket?: number) => undefined | Task<Data>)

    Dequeue task.

    +

    Type declaration

      • (bucket?): undefined | Task<Data>
      • Parameters

        • Optionalbucket: number

          The prioritized bucket to dequeue from.

          +

        Returns undefined | Task<Data>

        The dequeued task.

        +
    0
    +
    + +
    enqueueTask: ((task: Task<Data>) => number)

    Enqueue task.

    Type declaration

      • (task): number
      • Parameters

        Returns number

    Returns

    The tasks queue size.

    -
    getTaskFunctionWorkerUsage: ((name) => undefined | WorkerUsage)

    Gets task function worker usage statistics.

    +

    Returns number

    The tasks queue size.

    +
    getTaskFunctionWorkerUsage: ((name: string) => undefined | WorkerUsage)

    Gets task function worker usage statistics.

    Type declaration

    Returns

    The task function worker usage statistics if the task function worker usage statistics are initialized, undefined otherwise.

    -
    hasBackPressure: (() => boolean)

    Whether the worker node has back pressure (i.e. its tasks queue is full).

    -

    Type declaration

      • (): boolean
      • Returns boolean

    Returns

    true if the worker node has back pressure, false otherwise.

    -

    Worker info.

    -
    messageChannel?: MessageChannel

    Message channel (worker thread only).

    -
    registerOnceWorkerEventHandler: ((event, handler) => void)

    Registers once a worker event handler.

    +

    Returns undefined | WorkerUsage

    The task function worker usage statistics if the task function worker usage statistics are initialized, undefined otherwise.

    +
    hasBackPressure: (() => boolean)

    Whether the worker node has back pressure (i.e. its tasks queue is full).

    +

    Type declaration

      • (): boolean
      • Returns boolean

        true if the worker node has back pressure, false otherwise.

        +

    Worker info.

    +
    messageChannel?: MessageChannel

    Message channel (worker thread only).

    +
    registerOnceWorkerEventHandler: ((event: string, handler: EventHandler<Worker>) => void)

    Registers once a worker event handler.

    Type declaration

      • (event, handler): void
      • Parameters

        Returns void

    registerWorkerEventHandler: ((event, handler) => void)

    Registers a worker event handler.

    +

    Returns void

    registerWorkerEventHandler: ((event: string, handler: EventHandler<Worker>) => void)

    Registers a worker event handler.

    Type declaration

      • (event, handler): void
      • Parameters

        Returns void

    setTasksQueuePriority: ((enablePriority) => void)

    Sets tasks queue priority.

    +

    Returns void

    setTasksQueuePriority: ((enablePriority: boolean) => void)

    Sets tasks queue priority.

    Type declaration

      • (enablePriority): void
      • Parameters

        • enablePriority: boolean

          Whether to enable tasks queue priority.

          -

        Returns void

    strategyData?: StrategyData

    Worker choice strategy data. +

    Returns void

    strategyData?: StrategyData

    Worker choice strategy data. This is used to store data that are specific to the worker choice strategy.

    -
    tasksQueueBackPressureSize: number

    Tasks queue back pressure size. +

    tasksQueueBackPressureSize: number

    Tasks queue back pressure size. This is the number of tasks that can be enqueued before the worker node has back pressure.

    -
    tasksQueueSize: (() => number)

    Tasks queue size.

    -

    Type declaration

      • (): number
      • Returns number

    Returns

    The tasks queue size.

    -
    terminate: (() => Promise<void>)

    Terminates the worker node.

    -

    Type declaration

      • (): Promise<void>
      • Returns Promise<void>

    Worker usage statistics.

    -
    worker: Worker

    Worker.

    -

    Methods

    • Type Parameters

      • K

      Parameters

      • error: Error
      • event: string | symbol
      • Rest ...args: AnyRest

      Returns void

    • Alias for emitter.on(eventName, listener).

      -

      Type Parameters

      • K

      Parameters

      • eventName: string | symbol
      • listener: ((...args) => void)
          • (...args): void
          • Parameters

            • Rest ...args: any[]

            Returns void

      Returns this

      Since

      v0.1.26

      -
    • Synchronously calls each of the listeners registered for the event named eventName, in the order they were registered, passing the supplied arguments +

    tasksQueueSize: (() => number)

    Tasks queue size.

    +

    Type declaration

      • (): number
      • Returns number

        The tasks queue size.

        +
    terminate: (() => Promise<void>)

    Terminates the worker node.

    +

    Worker usage statistics.

    +
    worker: Worker

    Worker.

    +

    Methods

    • Type Parameters

      • K

      Parameters

      • error: Error
      • event: string | symbol
      • Rest...args: AnyRest

      Returns void

    • Alias for emitter.on(eventName, listener).

      +

      Type Parameters

      • K

      Parameters

      • eventName: string | symbol
      • listener: ((...args: any[]) => void)
          • (...args): void
          • Parameters

            • Rest...args: any[]

            Returns void

      Returns this

      v0.1.26

      +
    • Synchronously calls each of the listeners registered for the event named eventName, in the order they were registered, passing the supplied arguments to each.

      Returns true if the event had listeners, false otherwise.

      -
      import { EventEmitter } from 'node:events';
      const myEmitter = new EventEmitter();

      // First listener
      myEmitter.on('event', function firstListener() {
      console.log('Helloooo! first listener');
      });
      // Second listener
      myEmitter.on('event', function secondListener(arg1, arg2) {
      console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
      });
      // Third listener
      myEmitter.on('event', function thirdListener(...args) {
      const parameters = args.join(', ');
      console.log(`event with parameters ${parameters} in third listener`);
      });

      console.log(myEmitter.listeners('event'));

      myEmitter.emit('event', 1, 2, 3, 4, 5);

      // Prints:
      // [
      // [Function: firstListener],
      // [Function: secondListener],
      // [Function: thirdListener]
      // ]
      // Helloooo! first listener
      // event with parameters 1, 2 in second listener
      // event with parameters 1, 2, 3, 4, 5 in third listener -
      -

      Type Parameters

      • K

      Parameters

      • eventName: string | symbol
      • Rest ...args: AnyRest

      Returns boolean

      Since

      v0.1.26

      -
    • Returns an array listing the events for which the emitter has registered +

      import { EventEmitter } from 'node:events';
      const myEmitter = new EventEmitter();

      // First listener
      myEmitter.on('event', function firstListener() {
      console.log('Helloooo! first listener');
      });
      // Second listener
      myEmitter.on('event', function secondListener(arg1, arg2) {
      console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
      });
      // Third listener
      myEmitter.on('event', function thirdListener(...args) {
      const parameters = args.join(', ');
      console.log(`event with parameters ${parameters} in third listener`);
      });

      console.log(myEmitter.listeners('event'));

      myEmitter.emit('event', 1, 2, 3, 4, 5);

      // Prints:
      // [
      // [Function: firstListener],
      // [Function: secondListener],
      // [Function: thirdListener]
      // ]
      // Helloooo! first listener
      // event with parameters 1, 2 in second listener
      // event with parameters 1, 2, 3, 4, 5 in third listener +
      + +

      Type Parameters

      • K

      Parameters

      • eventName: string | symbol
      • Rest...args: AnyRest

      Returns boolean

      v0.1.26

      +
    • Returns an array listing the events for which the emitter has registered listeners. The values in the array are strings or Symbols.

      -
      import { EventEmitter } from 'node:events';

      const myEE = new EventEmitter();
      myEE.on('foo', () => {});
      myEE.on('bar', () => {});

      const sym = Symbol('symbol');
      myEE.on(sym, () => {});

      console.log(myEE.eventNames());
      // Prints: [ 'foo', 'bar', Symbol(symbol) ] -
      -

      Returns (string | symbol)[]

      Since

      v6.0.0

      -
    • Returns the current max listener value for the EventEmitter which is either +

      import { EventEmitter } from 'node:events';

      const myEE = new EventEmitter();
      myEE.on('foo', () => {});
      myEE.on('bar', () => {});

      const sym = Symbol('symbol');
      myEE.on(sym, () => {});

      console.log(myEE.eventNames());
      // Prints: [ 'foo', 'bar', Symbol(symbol) ] +
      + +

      Returns (string | symbol)[]

      v6.0.0

      +
    • Returns the current max listener value for the EventEmitter which is either set by emitter.setMaxListeners(n) or defaults to defaultMaxListeners.

      -

      Returns number

      Since

      v1.0.0

      -
    • Returns the number of listeners listening for the event named eventName. +

      Returns number

      v1.0.0

      +
    • Returns the number of listeners listening for the event named eventName. If listener is provided, it will return how many times the listener is found in the list of the listeners of the event.

      Type Parameters

      • K

      Parameters

      • eventName: string | symbol

        The name of the event being listened for

        -
      • Optional listener: Function

        The event handler function

        -

      Returns number

      Since

      v3.2.0

      -
    • Returns a copy of the array of listeners for the event named eventName.

      -
      server.on('connection', (stream) => {
      console.log('someone connected!');
      });
      console.log(util.inspect(server.listeners('connection')));
      // Prints: [ [Function] ] -
      -

      Type Parameters

      • K

      Parameters

      • eventName: string | symbol

      Returns Function[]

      Since

      v0.1.26

      -
    • Alias for emitter.removeListener().

      -

      Type Parameters

      • K

      Parameters

      • eventName: string | symbol
      • listener: ((...args) => void)
          • (...args): void
          • Parameters

            • Rest ...args: any[]

            Returns void

      Returns this

      Since

      v10.0.0

      -
    • Adds the listener function to the end of the listeners array for the event +

    • Optionallistener: Function

      The event handler function

      +

    Returns number

    v3.2.0

    +
    • Returns a copy of the array of listeners for the event named eventName.

      +
      server.on('connection', (stream) => {
      console.log('someone connected!');
      });
      console.log(util.inspect(server.listeners('connection')));
      // Prints: [ [Function] ] +
      + +

      Type Parameters

      • K

      Parameters

      • eventName: string | symbol

      Returns Function[]

      v0.1.26

      +
    • Alias for emitter.removeListener().

      +

      Type Parameters

      • K

      Parameters

      • eventName: string | symbol
      • listener: ((...args: any[]) => void)
          • (...args): void
          • Parameters

            • Rest...args: any[]

            Returns void

      Returns this

      v10.0.0

      +
    • Adds the listener function to the end of the listeners array for the event named eventName. No checks are made to see if the listener has already been added. Multiple calls passing the same combination of eventName and listener will result in the listener being added, and called, multiple times.

      -
      server.on('connection', (stream) => {
      console.log('someone connected!');
      }); -
      +
      server.on('connection', (stream) => {
      console.log('someone connected!');
      }); +
      +

      Returns a reference to the EventEmitter, so that calls can be chained.

      By default, event listeners are invoked in the order they are added. The emitter.prependListener() method can be used as an alternative to add the event listener to the beginning of the listeners array.

      -
      import { EventEmitter } from 'node:events';
      const myEE = new EventEmitter();
      myEE.on('foo', () => console.log('a'));
      myEE.prependListener('foo', () => console.log('b'));
      myEE.emit('foo');
      // Prints:
      // b
      // a -
      +
      import { EventEmitter } from 'node:events';
      const myEE = new EventEmitter();
      myEE.on('foo', () => console.log('a'));
      myEE.prependListener('foo', () => console.log('b'));
      myEE.emit('foo');
      // Prints:
      // b
      // a +
      +

      Type Parameters

      • K

      Parameters

      • eventName: string | symbol

        The name of the event.

        -
      • listener: ((...args) => void)

        The callback function

        -
          • (...args): void
          • Parameters

            • Rest ...args: any[]

            Returns void

      Returns this

      Since

      v0.1.101

      -
    • Adds a one-time listener function for the event named eventName. The +

    • listener: ((...args: any[]) => void)

      The callback function

      +
        • (...args): void
        • Parameters

          • Rest...args: any[]

          Returns void

    Returns this

    v0.1.101

    +
    • Adds a one-time listener function for the event named eventName. The next time eventName is triggered, this listener is removed and then invoked.

      -
      server.once('connection', (stream) => {
      console.log('Ah, we have our first user!');
      }); -
      +
      server.once('connection', (stream) => {
      console.log('Ah, we have our first user!');
      }); +
      +

      Returns a reference to the EventEmitter, so that calls can be chained.

      By default, event listeners are invoked in the order they are added. The emitter.prependOnceListener() method can be used as an alternative to add the event listener to the beginning of the listeners array.

      -
      import { EventEmitter } from 'node:events';
      const myEE = new EventEmitter();
      myEE.once('foo', () => console.log('a'));
      myEE.prependOnceListener('foo', () => console.log('b'));
      myEE.emit('foo');
      // Prints:
      // b
      // a -
      +
      import { EventEmitter } from 'node:events';
      const myEE = new EventEmitter();
      myEE.once('foo', () => console.log('a'));
      myEE.prependOnceListener('foo', () => console.log('b'));
      myEE.emit('foo');
      // Prints:
      // b
      // a +
      +

      Type Parameters

      • K

      Parameters

      • eventName: string | symbol

        The name of the event.

        -
      • listener: ((...args) => void)

        The callback function

        -
          • (...args): void
          • Parameters

            • Rest ...args: any[]

            Returns void

      Returns this

      Since

      v0.3.0

      -
    • Adds the listener function to the beginning of the listeners array for the +

    • listener: ((...args: any[]) => void)

      The callback function

      +
        • (...args): void
        • Parameters

          • Rest...args: any[]

          Returns void

    Returns this

    v0.3.0

    +
    • Adds the listener function to the beginning of the listeners array for the event named eventName. No checks are made to see if the listener has already been added. Multiple calls passing the same combination of eventName and listener will result in the listener being added, and called, multiple times.

      -
      server.prependListener('connection', (stream) => {
      console.log('someone connected!');
      }); -
      +
      server.prependListener('connection', (stream) => {
      console.log('someone connected!');
      }); +
      +

      Returns a reference to the EventEmitter, so that calls can be chained.

      Type Parameters

      • K

      Parameters

      • eventName: string | symbol

        The name of the event.

        -
      • listener: ((...args) => void)

        The callback function

        -
          • (...args): void
          • Parameters

            • Rest ...args: any[]

            Returns void

      Returns this

      Since

      v6.0.0

      -
    • Adds a one-timelistener function for the event named eventName to the beginning of the listeners array. The next time eventName is triggered, this +

    • listener: ((...args: any[]) => void)

      The callback function

      +
        • (...args): void
        • Parameters

          • Rest...args: any[]

          Returns void

    Returns this

    v6.0.0

    +
    • Adds a one-timelistener function for the event named eventName to the beginning of the listeners array. The next time eventName is triggered, this listener is removed, and then invoked.

      -
      server.prependOnceListener('connection', (stream) => {
      console.log('Ah, we have our first user!');
      }); -
      +
      server.prependOnceListener('connection', (stream) => {
      console.log('Ah, we have our first user!');
      }); +
      +

      Returns a reference to the EventEmitter, so that calls can be chained.

      Type Parameters

      • K

      Parameters

      • eventName: string | symbol

        The name of the event.

        -
      • listener: ((...args) => void)

        The callback function

        -
          • (...args): void
          • Parameters

            • Rest ...args: any[]

            Returns void

      Returns this

      Since

      v6.0.0

      -
    • Returns a copy of the array of listeners for the event named eventName, +

    • listener: ((...args: any[]) => void)

      The callback function

      +
        • (...args): void
        • Parameters

          • Rest...args: any[]

          Returns void

    Returns this

    v6.0.0

    +
    • Returns a copy of the array of listeners for the event named eventName, including any wrappers (such as those created by .once()).

      -
      import { EventEmitter } from 'node:events';
      const emitter = new EventEmitter();
      emitter.once('log', () => console.log('log once'));

      // Returns a new Array with a function `onceWrapper` which has a property
      // `listener` which contains the original listener bound above
      const listeners = emitter.rawListeners('log');
      const logFnWrapper = listeners[0];

      // Logs "log once" to the console and does not unbind the `once` event
      logFnWrapper.listener();

      // Logs "log once" to the console and removes the listener
      logFnWrapper();

      emitter.on('log', () => console.log('log persistently'));
      // Will return a new Array with a single function bound by `.on()` above
      const newListeners = emitter.rawListeners('log');

      // Logs "log persistently" twice
      newListeners[0]();
      emitter.emit('log'); -
      -

      Type Parameters

      • K

      Parameters

      • eventName: string | symbol

      Returns Function[]

      Since

      v9.4.0

      -
    • Removes all listeners, or those of the specified eventName.

      +
      import { EventEmitter } from 'node:events';
      const emitter = new EventEmitter();
      emitter.once('log', () => console.log('log once'));

      // Returns a new Array with a function `onceWrapper` which has a property
      // `listener` which contains the original listener bound above
      const listeners = emitter.rawListeners('log');
      const logFnWrapper = listeners[0];

      // Logs "log once" to the console and does not unbind the `once` event
      logFnWrapper.listener();

      // Logs "log once" to the console and removes the listener
      logFnWrapper();

      emitter.on('log', () => console.log('log persistently'));
      // Will return a new Array with a single function bound by `.on()` above
      const newListeners = emitter.rawListeners('log');

      // Logs "log persistently" twice
      newListeners[0]();
      emitter.emit('log'); +
      + +

      Type Parameters

      • K

      Parameters

      • eventName: string | symbol

      Returns Function[]

      v9.4.0

      +
    • Removes all listeners, or those of the specified eventName.

      It is bad practice to remove listeners added elsewhere in the code, particularly when the EventEmitter instance was created by some other component or module (e.g. sockets or file streams).

      Returns a reference to the EventEmitter, so that calls can be chained.

      -

      Parameters

      • Optional eventName: string | symbol

      Returns this

      Since

      v0.1.26

      -
    • Removes the specified listener from the listener array for the event named eventName.

      -
      const callback = (stream) => {
      console.log('someone connected!');
      };
      server.on('connection', callback);
      // ...
      server.removeListener('connection', callback); -
      +

      Parameters

      • OptionaleventName: string | symbol

      Returns this

      v0.1.26

      +
    • Removes the specified listener from the listener array for the event named eventName.

      +
      const callback = (stream) => {
      console.log('someone connected!');
      };
      server.on('connection', callback);
      // ...
      server.removeListener('connection', callback); +
      +

      removeListener() will remove, at most, one instance of a listener from the listener array. If any single listener has been added multiple times to the listener array for the specified eventName, then removeListener() must be @@ -166,8 +178,9 @@ called multiple times to remove each instance.

      Once an event is emitted, all listeners attached to it at the time of emitting are called in order. This implies that any removeListener() or removeAllListeners() calls after emitting and before the last listener finishes execution will not remove them fromemit() in progress. Subsequent events behave as expected.

      -
      import { EventEmitter } from 'node:events';
      class MyEmitter extends EventEmitter {}
      const myEmitter = new MyEmitter();

      const callbackA = () => {
      console.log('A');
      myEmitter.removeListener('event', callbackB);
      };

      const callbackB = () => {
      console.log('B');
      };

      myEmitter.on('event', callbackA);

      myEmitter.on('event', callbackB);

      // callbackA removes listener callbackB but it will still be called.
      // Internal listener array at time of emit [callbackA, callbackB]
      myEmitter.emit('event');
      // Prints:
      // A
      // B

      // callbackB is now removed.
      // Internal listener array [callbackA]
      myEmitter.emit('event');
      // Prints:
      // A -
      +
      import { EventEmitter } from 'node:events';
      class MyEmitter extends EventEmitter {}
      const myEmitter = new MyEmitter();

      const callbackA = () => {
      console.log('A');
      myEmitter.removeListener('event', callbackB);
      };

      const callbackB = () => {
      console.log('B');
      };

      myEmitter.on('event', callbackA);

      myEmitter.on('event', callbackB);

      // callbackA removes listener callbackB but it will still be called.
      // Internal listener array at time of emit [callbackA, callbackB]
      myEmitter.emit('event');
      // Prints:
      // A
      // B

      // callbackB is now removed.
      // Internal listener array [callbackA]
      myEmitter.emit('event');
      // Prints:
      // A +
      +

      Because listeners are managed using an internal array, calling this will change the position indices of any listener registered after the listener being removed. This will not impact the order in which listeners are called, @@ -175,15 +188,16 @@ but it means that any copies of the listener array as returned by the emitter.listeners() method will need to be recreated.

      When a single function has been added as a handler multiple times for a single event (as in the example below), removeListener() will remove the most -recently added instance. In the example the once('ping') listener is removed:

      -
      import { EventEmitter } from 'node:events';
      const ee = new EventEmitter();

      function pong() {
      console.log('pong');
      }

      ee.on('ping', pong);
      ee.once('ping', pong);
      ee.removeListener('ping', pong);

      ee.emit('ping');
      ee.emit('ping'); -
      +recently added instance. In the example the once('ping') listener is removed:

      +
      import { EventEmitter } from 'node:events';
      const ee = new EventEmitter();

      function pong() {
      console.log('pong');
      }

      ee.on('ping', pong);
      ee.once('ping', pong);
      ee.removeListener('ping', pong);

      ee.emit('ping');
      ee.emit('ping'); +
      +

      Returns a reference to the EventEmitter, so that calls can be chained.

      -

      Type Parameters

      • K

      Parameters

      • eventName: string | symbol
      • listener: ((...args) => void)
          • (...args): void
          • Parameters

            • Rest ...args: any[]

            Returns void

      Returns this

      Since

      v0.1.26

      -
    • By default EventEmitters will print a warning if more than 10 listeners are +

      Type Parameters

      • K

      Parameters

      • eventName: string | symbol
      • listener: ((...args: any[]) => void)
          • (...args): void
          • Parameters

            • Rest...args: any[]

            Returns void

      Returns this

      v0.1.26

      +
    • By default EventEmitters will print a warning if more than 10 listeners are added for a particular event. This is a useful default that helps finding memory leaks. The emitter.setMaxListeners() method allows the limit to be modified for this specific EventEmitter instance. The value can be set to Infinity (or 0) to indicate an unlimited number of listeners.

      Returns a reference to the EventEmitter, so that calls can be chained.

      -

      Parameters

      • n: number

      Returns this

      Since

      v0.3.5

      -
    \ No newline at end of file +

    Parameters

    • n: number

    Returns this

    v0.3.5

    +
    \ No newline at end of file diff --git a/docs/interfaces/MeasurementOptions.html b/docs/interfaces/MeasurementOptions.html index 1bf8b26b..fe0f157f 100644 --- a/docs/interfaces/MeasurementOptions.html +++ b/docs/interfaces/MeasurementOptions.html @@ -1,4 +1,4 @@ -MeasurementOptions | poolifier - v4.0.15

    Interface MeasurementOptions

    Measurement options.

    -
    interface MeasurementOptions {
        median: boolean;
    }

    Properties

    Properties

    median: boolean

    Set measurement median.

    -
    \ No newline at end of file +MeasurementOptions | poolifier - v4.0.15

    Interface MeasurementOptions

    Measurement options.

    +
    interface MeasurementOptions {
        median: boolean;
    }

    Properties

    Properties

    median: boolean

    Set measurement median.

    +
    \ No newline at end of file diff --git a/docs/interfaces/MeasurementStatistics.html b/docs/interfaces/MeasurementStatistics.html index dca4542f..92d7f960 100644 --- a/docs/interfaces/MeasurementStatistics.html +++ b/docs/interfaces/MeasurementStatistics.html @@ -1,14 +1,14 @@ -MeasurementStatistics | poolifier - v4.0.15

    Interface MeasurementStatisticsInternal

    Measurement statistics.

    -
    interface MeasurementStatistics {
        aggregate?: number;
        average?: number;
        history: CircularBuffer;
        maximum?: number;
        median?: number;
        minimum?: number;
    }

    Properties

    aggregate? +MeasurementStatistics | poolifier - v4.0.15

    Interface MeasurementStatisticsInternal

    Measurement statistics.

    +
    interface MeasurementStatistics {
        aggregate?: number;
        average?: number;
        history: CircularBuffer;
        maximum?: number;
        median?: number;
        minimum?: number;
    }

    Properties

    aggregate?: number

    Measurement aggregate.

    -
    average?: number

    Measurement average.

    -

    Measurement history.

    -
    maximum?: number

    Measurement maximum.

    -
    median?: number

    Measurement median.

    -
    minimum?: number

    Measurement minimum.

    -
    \ No newline at end of file +

    Properties

    aggregate?: number

    Measurement aggregate.

    +
    average?: number

    Measurement average.

    +

    Measurement history.

    +
    maximum?: number

    Measurement maximum.

    +
    median?: number

    Measurement median.

    +
    minimum?: number

    Measurement minimum.

    +
    \ No newline at end of file diff --git a/docs/interfaces/MeasurementStatisticsRequirements.html b/docs/interfaces/MeasurementStatisticsRequirements.html index a63586c8..3e5db943 100644 --- a/docs/interfaces/MeasurementStatisticsRequirements.html +++ b/docs/interfaces/MeasurementStatisticsRequirements.html @@ -1,8 +1,8 @@ -MeasurementStatisticsRequirements | poolifier - v4.0.15

    Interface MeasurementStatisticsRequirementsInternal

    Measurement statistics requirements.

    -
    interface MeasurementStatisticsRequirements {
        aggregate: boolean;
        average: boolean;
        median: boolean;
    }

    Properties

    aggregate +MeasurementStatisticsRequirements | poolifier - v4.0.15

    Interface MeasurementStatisticsRequirementsInternal

    Measurement statistics requirements.

    +
    interface MeasurementStatisticsRequirements {
        aggregate: boolean;
        average: boolean;
        median: boolean;
    }

    Properties

    aggregate: boolean

    Requires measurement aggregate.

    -
    average: boolean

    Requires measurement average.

    -
    median: boolean

    Requires measurement median.

    -
    \ No newline at end of file +

    Properties

    aggregate: boolean

    Requires measurement aggregate.

    +
    average: boolean

    Requires measurement average.

    +
    median: boolean

    Requires measurement median.

    +
    \ No newline at end of file diff --git a/docs/interfaces/MessageValue.html b/docs/interfaces/MessageValue.html index 29d07e88..049dedcc 100644 --- a/docs/interfaces/MessageValue.html +++ b/docs/interfaces/MessageValue.html @@ -1,7 +1,7 @@ -MessageValue | poolifier - v4.0.15

    Interface MessageValue<Data, ErrorData>Internal

    Message object that is passed between main worker and worker.

    -
    interface MessageValue<Data, ErrorData> {
        checkActive?: boolean;
        data?: Data;
        kill?: true | "success" | "SOFT" | "HARD" | "failure";
        name?: string;
        port?: MessagePort;
        priority?: number;
        ready?: boolean;
        statistics?: WorkerStatistics;
        strategy?: "ROUND_ROBIN" | "LEAST_USED" | "LEAST_BUSY" | "LEAST_ELU" | "FAIR_SHARE" | "WEIGHTED_ROUND_ROBIN" | "INTERLEAVED_WEIGHTED_ROUND_ROBIN";
        taskFunction?: string;
        taskFunctionOperation?: "add" | "default" | "remove";
        taskFunctionOperationStatus?: boolean;
        taskFunctionProperties?: TaskFunctionProperties;
        taskFunctionsProperties?: TaskFunctionProperties[];
        taskId?: `${string}-${string}-${string}-${string}-${string}`;
        taskPerformance?: TaskPerformance;
        timestamp?: number;
        transferList?: readonly TransferListItem[];
        workerError?: WorkerError<ErrorData>;
        workerId?: number;
    }

    Type Parameters

    • Data = unknown

      Type of data sent to the worker or execution response. This can only be structured-cloneable data.

      +MessageValue | poolifier - v4.0.15

      Interface MessageValue<Data, ErrorData>Internal

      Message object that is passed between main worker and worker.

      +
      interface MessageValue<Data, ErrorData> {
          checkActive?: boolean;
          data?: Data;
          kill?:
              | true
              | "success"
              | "SOFT"
              | "HARD"
              | "failure";
          name?: string;
          port?: MessagePort;
          priority?: number;
          ready?: boolean;
          statistics?: WorkerStatistics;
          strategy?:
              | "ROUND_ROBIN"
              | "LEAST_USED"
              | "LEAST_BUSY"
              | "LEAST_ELU"
              | "FAIR_SHARE"
              | "WEIGHTED_ROUND_ROBIN"
              | "INTERLEAVED_WEIGHTED_ROUND_ROBIN";
          taskFunction?: string;
          taskFunctionOperation?: "add" | "default" | "remove";
          taskFunctionOperationStatus?: boolean;
          taskFunctionProperties?: TaskFunctionProperties;
          taskFunctionsProperties?: TaskFunctionProperties[];
          taskId?: `${string}-${string}-${string}-${string}-${string}`;
          taskPerformance?: TaskPerformance;
          timestamp?: number;
          transferList?: readonly TransferListItem[];
          workerError?: WorkerError<ErrorData>;
          workerId?: number;
      }

      Type Parameters

      • Data = unknown

        Type of data sent to the worker or execution response. This can only be structured-cloneable data.

      • ErrorData = unknown

        Type of data sent to the worker triggering an error. This can only be structured-cloneable data.

        -

      Hierarchy (view full)

      Properties

    Hierarchy (view full)

    Properties

    checkActive?: boolean

    Whether the worker starts or stops its activity check.

    -
    data?: Data

    Task input data that will be passed to the worker.

    -
    kill?: true | "success" | "SOFT" | "HARD" | "failure"

    Kill code.

    -
    name?: string

    Task name.

    -
    port?: MessagePort

    Message port.

    -
    priority?: number

    Task priority. Lower values have higher priority.

    -

    Default Value

    0
    -
    -
    ready?: boolean

    Whether the worker is ready or not.

    -
    statistics?: WorkerStatistics

    Whether the worker computes the given statistics or not.

    -
    strategy?: "ROUND_ROBIN" | "LEAST_USED" | "LEAST_BUSY" | "LEAST_ELU" | "FAIR_SHARE" | "WEIGHTED_ROUND_ROBIN" | "INTERLEAVED_WEIGHTED_ROUND_ROBIN"

    Task worker choice strategy.

    -
    taskFunction?: string

    Task function serialized to string.

    -
    taskFunctionOperation?: "add" | "default" | "remove"

    Task function operation:

    +

    Properties

    checkActive?: boolean

    Whether the worker starts or stops its activity check.

    +
    data?: Data

    Task input data that will be passed to the worker.

    +
    kill?:
        | true
        | "success"
        | "SOFT"
        | "HARD"
        | "failure"

    Kill code.

    +
    name?: string

    Task name.

    +
    port?: MessagePort

    Message port.

    +
    priority?: number

    Task priority. Lower values have higher priority.

    +
    0
    +
    + +
    ready?: boolean

    Whether the worker is ready or not.

    +
    statistics?: WorkerStatistics

    Whether the worker computes the given statistics or not.

    +
    strategy?:
        | "ROUND_ROBIN"
        | "LEAST_USED"
        | "LEAST_BUSY"
        | "LEAST_ELU"
        | "FAIR_SHARE"
        | "WEIGHTED_ROUND_ROBIN"
        | "INTERLEAVED_WEIGHTED_ROUND_ROBIN"

    Task worker choice strategy.

    +
    taskFunction?: string

    Task function serialized to string.

    +
    taskFunctionOperation?: "add" | "default" | "remove"

    Task function operation:

      -
    • 'add' - Add a task function.
    • -
    • 'remove' - Remove a task function.
    • -
    • 'default' - Set a task function as default.
    • +
    • 'add' - Add a task function.
    • +
    • 'remove' - Remove a task function.
    • +
    • 'default' - Set a task function as default.
    -
    taskFunctionOperationStatus?: boolean

    Whether the task function operation is successful or not.

    -
    taskFunctionProperties?: TaskFunctionProperties

    Task function properties.

    -
    taskFunctionsProperties?: TaskFunctionProperties[]

    Task functions properties.

    -
    taskId?: `${string}-${string}-${string}-${string}-${string}`

    Task UUID.

    -
    taskPerformance?: TaskPerformance

    Task performance.

    -
    timestamp?: number

    Timestamp.

    -
    transferList?: readonly TransferListItem[]

    Array of transferable objects.

    -
    workerError?: WorkerError<ErrorData>

    Worker error.

    -
    workerId?: number

    Worker id.

    -
    \ No newline at end of file +
    taskFunctionOperationStatus?: boolean

    Whether the task function operation is successful or not.

    +
    taskFunctionProperties?: TaskFunctionProperties

    Task function properties.

    +
    taskFunctionsProperties?: TaskFunctionProperties[]

    Task functions properties.

    +
    taskId?: `${string}-${string}-${string}-${string}-${string}`

    Task UUID.

    +
    taskPerformance?: TaskPerformance

    Task performance.

    +
    timestamp?: number

    Timestamp.

    +
    transferList?: readonly TransferListItem[]

    Array of transferable objects.

    +
    workerError?: WorkerError<ErrorData>

    Worker error.

    +
    workerId?: number

    Worker id.

    +
    \ No newline at end of file diff --git a/docs/interfaces/PoolInfo.html b/docs/interfaces/PoolInfo.html index da65e3f1..d74d1683 100644 --- a/docs/interfaces/PoolInfo.html +++ b/docs/interfaces/PoolInfo.html @@ -1,5 +1,5 @@ -PoolInfo | poolifier - v4.0.15

    Interface PoolInfo

    Pool information.

    -
    interface PoolInfo {
        backPressure?: boolean;
        busyWorkerNodes: number;
        defaultStrategy: "ROUND_ROBIN" | "LEAST_USED" | "LEAST_BUSY" | "LEAST_ELU" | "FAIR_SHARE" | "WEIGHTED_ROUND_ROBIN" | "INTERLEAVED_WEIGHTED_ROUND_ROBIN";
        elu?: {
            active: {
                average?: number;
                maximum: number;
                median?: number;
                minimum: number;
            };
            idle: {
                average?: number;
                maximum: number;
                median?: number;
                minimum: number;
            };
            utilization: {
                average?: number;
                median?: number;
            };
        };
        executedTasks: number;
        executingTasks: number;
        failedTasks: number;
        idleWorkerNodes: number;
        maxQueuedTasks?: number;
        maxSize: number;
        minSize: number;
        queuedTasks?: number;
        ready: boolean;
        runTime?: {
            average?: number;
            maximum: number;
            median?: number;
            minimum: number;
        };
        started: boolean;
        stealingWorkerNodes?: number;
        stolenTasks?: number;
        strategyRetries: number;
        type: "fixed" | "dynamic";
        utilization?: number;
        version: string;
        waitTime?: {
            average?: number;
            maximum: number;
            median?: number;
            minimum: number;
        };
        worker: "thread" | "cluster";
        workerNodes: number;
    }

    Properties

    backPressure? +PoolInfo | poolifier - v4.0.15

    Interface PoolInfo

    Pool information.

    +
    interface PoolInfo {
        backPressure?: boolean;
        busyWorkerNodes: number;
        defaultStrategy:
            | "ROUND_ROBIN"
            | "LEAST_USED"
            | "LEAST_BUSY"
            | "LEAST_ELU"
            | "FAIR_SHARE"
            | "WEIGHTED_ROUND_ROBIN"
            | "INTERLEAVED_WEIGHTED_ROUND_ROBIN";
        elu?: {
            active: {
                average?: number;
                maximum: number;
                median?: number;
                minimum: number;
            };
            idle: {
                average?: number;
                maximum: number;
                median?: number;
                minimum: number;
            };
            utilization: {
                average?: number;
                median?: number;
            };
        };
        executedTasks: number;
        executingTasks: number;
        failedTasks: number;
        idleWorkerNodes: number;
        maxQueuedTasks?: number;
        maxSize: number;
        minSize: number;
        queuedTasks?: number;
        ready: boolean;
        runTime?: {
            average?: number;
            maximum: number;
            median?: number;
            minimum: number;
        };
        started: boolean;
        stealingWorkerNodes?: number;
        stolenTasks?: number;
        strategyRetries: number;
        type: "fixed" | "dynamic";
        utilization?: number;
        version: string;
        waitTime?: {
            average?: number;
            maximum: number;
            median?: number;
            minimum: number;
        };
        worker: "thread" | "cluster";
        workerNodes: number;
    }

    Properties

    backPressure?: boolean
    busyWorkerNodes: number

    Pool busy worker nodes.

    -
    defaultStrategy: "ROUND_ROBIN" | "LEAST_USED" | "LEAST_BUSY" | "LEAST_ELU" | "FAIR_SHARE" | "WEIGHTED_ROUND_ROBIN" | "INTERLEAVED_WEIGHTED_ROUND_ROBIN"
    elu?: {
        active: {
            average?: number;
            maximum: number;
            median?: number;
            minimum: number;
        };
        idle: {
            average?: number;
            maximum: number;
            median?: number;
            minimum: number;
        };
        utilization: {
            average?: number;
            median?: number;
        };
    }

    Type declaration

    • active: {
          average?: number;
          maximum: number;
          median?: number;
          minimum: number;
      }
      • Optional Readonly average?: number
      • Readonly maximum: number
      • Optional Readonly median?: number
      • Readonly minimum: number
    • idle: {
          average?: number;
          maximum: number;
          median?: number;
          minimum: number;
      }
      • Optional Readonly average?: number
      • Readonly maximum: number
      • Optional Readonly median?: number
      • Readonly minimum: number
    • utilization: {
          average?: number;
          median?: number;
      }
      • Optional Readonly average?: number
      • Optional Readonly median?: number
    executedTasks: number
    executingTasks: number
    failedTasks: number
    idleWorkerNodes: number

    Pool idle worker nodes.

    -
    maxQueuedTasks?: number
    maxSize: number
    minSize: number
    queuedTasks?: number
    ready: boolean
    runTime?: {
        average?: number;
        maximum: number;
        median?: number;
        minimum: number;
    }

    Type declaration

    • Optional Readonly average?: number
    • Readonly maximum: number
    • Optional Readonly median?: number
    • Readonly minimum: number
    started: boolean
    stealingWorkerNodes?: number

    Pool stealing worker nodes.

    -
    stolenTasks?: number
    strategyRetries: number
    type: "fixed" | "dynamic"
    utilization?: number

    Pool utilization.

    -
    version: string
    waitTime?: {
        average?: number;
        maximum: number;
        median?: number;
        minimum: number;
    }

    Type declaration

    • Optional Readonly average?: number
    • Readonly maximum: number
    • Optional Readonly median?: number
    • Readonly minimum: number
    worker: "thread" | "cluster"
    workerNodes: number

    Pool total worker nodes.

    -
    \ No newline at end of file +

    Properties

    backPressure?: boolean
    busyWorkerNodes: number

    Pool busy worker nodes.

    +
    defaultStrategy:
        | "ROUND_ROBIN"
        | "LEAST_USED"
        | "LEAST_BUSY"
        | "LEAST_ELU"
        | "FAIR_SHARE"
        | "WEIGHTED_ROUND_ROBIN"
        | "INTERLEAVED_WEIGHTED_ROUND_ROBIN"
    elu?: {
        active: {
            average?: number;
            maximum: number;
            median?: number;
            minimum: number;
        };
        idle: {
            average?: number;
            maximum: number;
            median?: number;
            minimum: number;
        };
        utilization: {
            average?: number;
            median?: number;
        };
    }
    executedTasks: number
    executingTasks: number
    failedTasks: number
    idleWorkerNodes: number

    Pool idle worker nodes.

    +
    maxQueuedTasks?: number
    maxSize: number
    minSize: number
    queuedTasks?: number
    ready: boolean
    runTime?: {
        average?: number;
        maximum: number;
        median?: number;
        minimum: number;
    }
    started: boolean
    stealingWorkerNodes?: number

    Pool stealing worker nodes.

    +
    stolenTasks?: number
    strategyRetries: number
    type: "fixed" | "dynamic"
    utilization?: number

    Pool utilization.

    +
    version: string
    waitTime?: {
        average?: number;
        maximum: number;
        median?: number;
        minimum: number;
    }
    worker: "thread" | "cluster"
    workerNodes: number

    Pool total worker nodes.

    +
    \ No newline at end of file diff --git a/docs/interfaces/PoolOptions.html b/docs/interfaces/PoolOptions.html index 757900b2..52df0703 100644 --- a/docs/interfaces/PoolOptions.html +++ b/docs/interfaces/PoolOptions.html @@ -1,6 +1,6 @@ -PoolOptions | poolifier - v4.0.15

    Interface PoolOptions<Worker>

    Options for a poolifier pool.

    -
    interface PoolOptions<Worker> {
        enableEvents?: boolean;
        enableTasksQueue?: boolean;
        env?: Record<string, unknown>;
        errorHandler?: ErrorHandler<Worker>;
        exitHandler?: ExitHandler<Worker>;
        messageHandler?: MessageHandler<Worker>;
        onlineHandler?: OnlineHandler<Worker>;
        restartWorkerOnError?: boolean;
        settings?: ClusterSettings;
        startWorkers?: boolean;
        tasksQueueOptions?: TasksQueueOptions;
        workerChoiceStrategy?: "ROUND_ROBIN" | "LEAST_USED" | "LEAST_BUSY" | "LEAST_ELU" | "FAIR_SHARE" | "WEIGHTED_ROUND_ROBIN" | "INTERLEAVED_WEIGHTED_ROUND_ROBIN";
        workerChoiceStrategyOptions?: WorkerChoiceStrategyOptions;
        workerOptions?: WorkerOptions;
    }

    Type Parameters

    • Worker extends IWorker

      Type of worker.

      -

    Properties

    enableEvents? +PoolOptions | poolifier - v4.0.15

    Interface PoolOptions<Worker>

    Options for a poolifier pool.

    +
    interface PoolOptions<Worker> {
        enableEvents?: boolean;
        enableTasksQueue?: boolean;
        env?: Record<string, unknown>;
        errorHandler?: ErrorHandler<Worker>;
        exitHandler?: ExitHandler<Worker>;
        messageHandler?: MessageHandler<Worker>;
        onlineHandler?: OnlineHandler<Worker>;
        restartWorkerOnError?: boolean;
        settings?: ClusterSettings;
        startWorkers?: boolean;
        tasksQueueOptions?: TasksQueueOptions;
        workerChoiceStrategy?:
            | "ROUND_ROBIN"
            | "LEAST_USED"
            | "LEAST_BUSY"
            | "LEAST_ELU"
            | "FAIR_SHARE"
            | "WEIGHTED_ROUND_ROBIN"
            | "INTERLEAVED_WEIGHTED_ROUND_ROBIN";
        workerChoiceStrategyOptions?: WorkerChoiceStrategyOptions;
        workerOptions?: WorkerOptions;
    }

    Type Parameters

    • Worker extends IWorker

      Type of worker.

      +

    Properties

    enableEvents?: boolean

    Pool events integrated with async resource emission.

    -

    Default Value

    true
    -
    -
    enableTasksQueue?: boolean

    Pool worker node tasks queue.

    -

    Default Value

    false
    -
    -
    env?: Record<string, unknown>

    Key/value pairs to add to worker process environment.

    -
    errorHandler?: ErrorHandler<Worker>

    A function that will listen for error event on each worker.

    -

    Default Value

    () => {}

    -
    exitHandler?: ExitHandler<Worker>

    A function that will listen for exit event on each worker.

    -

    Default Value

    () => {}

    -
    messageHandler?: MessageHandler<Worker>

    A function that will listen for message event on each worker.

    -

    Default Value

    () => {}

    -
    onlineHandler?: OnlineHandler<Worker>

    A function that will listen for online event on each worker.

    -

    Default Value

    () => {}

    -
    restartWorkerOnError?: boolean

    Restart worker on error.

    -
    settings?: ClusterSettings

    Cluster settings.

    -
    startWorkers?: boolean

    Whether to start the minimum number of workers at pool initialization.

    -

    Default Value

    true
    -
    -
    tasksQueueOptions?: TasksQueueOptions

    Pool worker node tasks queue options.

    -
    workerChoiceStrategy?: "ROUND_ROBIN" | "LEAST_USED" | "LEAST_BUSY" | "LEAST_ELU" | "FAIR_SHARE" | "WEIGHTED_ROUND_ROBIN" | "INTERLEAVED_WEIGHTED_ROUND_ROBIN"

    The default worker choice strategy to use in this pool.

    -

    Default Value

    WorkerChoiceStrategies.ROUND_ROBIN
    -
    -
    workerChoiceStrategyOptions?: WorkerChoiceStrategyOptions

    The worker choice strategy options.

    -
    workerOptions?: WorkerOptions

    Worker options.

    -
    \ No newline at end of file +

    Properties

    enableEvents?: boolean

    Pool events integrated with async resource emission.

    +
    true
    +
    + +
    enableTasksQueue?: boolean

    Pool worker node tasks queue.

    +
    false
    +
    + +
    env?: Record<string, unknown>

    Key/value pairs to add to worker process environment.

    +
    errorHandler?: ErrorHandler<Worker>

    A function that will listen for error event on each worker.

    +

    () => {}

    +
    exitHandler?: ExitHandler<Worker>

    A function that will listen for exit event on each worker.

    +

    () => {}

    +
    messageHandler?: MessageHandler<Worker>

    A function that will listen for message event on each worker.

    +

    () => {}

    +
    onlineHandler?: OnlineHandler<Worker>

    A function that will listen for online event on each worker.

    +

    () => {}

    +
    restartWorkerOnError?: boolean

    Restart worker on error.

    +
    settings?: ClusterSettings

    Cluster settings.

    +
    startWorkers?: boolean

    Whether to start the minimum number of workers at pool initialization.

    +
    true
    +
    + +
    tasksQueueOptions?: TasksQueueOptions

    Pool worker node tasks queue options.

    +
    workerChoiceStrategy?:
        | "ROUND_ROBIN"
        | "LEAST_USED"
        | "LEAST_BUSY"
        | "LEAST_ELU"
        | "FAIR_SHARE"
        | "WEIGHTED_ROUND_ROBIN"
        | "INTERLEAVED_WEIGHTED_ROUND_ROBIN"

    The default worker choice strategy to use in this pool.

    +
    WorkerChoiceStrategies.ROUND_ROBIN
    +
    + +
    workerChoiceStrategyOptions?: WorkerChoiceStrategyOptions

    The worker choice strategy options.

    +
    workerOptions?: WorkerOptions

    Worker options.

    +
    \ No newline at end of file diff --git a/docs/interfaces/PriorityQueueNode.html b/docs/interfaces/PriorityQueueNode.html index 1fd3b7d3..383789f3 100644 --- a/docs/interfaces/PriorityQueueNode.html +++ b/docs/interfaces/PriorityQueueNode.html @@ -1,6 +1,6 @@ -PriorityQueueNode | poolifier - v4.0.15

    Interface PriorityQueueNode<T>Internal

    Priority queue node.

    -
    interface PriorityQueueNode<T> {
        capacity: number;
        enablePriority: boolean;
        next?: FixedPriorityQueue<T>;
        size: number;
        [iterator](): Iterator<T, any, undefined>;
        clear(): void;
        dequeue(): undefined | T;
        empty(): boolean;
        enqueue(data, priority?): number;
        full(): boolean;
        get(index): undefined | T;
    }

    Type Parameters

    • T

      Type of priority queue node data.

      -

    Hierarchy (view full)

    Properties

    capacity +PriorityQueueNode | poolifier - v4.0.15

    Interface PriorityQueueNode<T>Internal

    Priority queue node.

    +
    interface PriorityQueueNode<T> {
        capacity: number;
        enablePriority: boolean;
        next?: FixedPriorityQueue<T>;
        size: number;
        [iterator](): Iterator<T, any, undefined>;
        clear(): void;
        dequeue(): undefined | T;
        empty(): boolean;
        enqueue(data: T, priority?: number): number;
        full(): boolean;
        get(index: number): undefined | T;
    }

    Type Parameters

    • T

      Type of priority queue node data.

      +

    Hierarchy (view full)

    Properties

    Properties

    capacity: number

    The fixed priority queue capacity.

    -
    enablePriority: boolean

    Whether to enable priority.

    -
    size: number

    The fixed priority queue size.

    -

    Methods

    • Returns an iterator for the fixed priority queue.

      +

    Properties

    capacity: number

    The fixed priority queue capacity.

    +
    enablePriority: boolean

    Whether to enable priority.

    +
    size: number

    The fixed priority queue size.

    +

    Methods

    • Enqueue data into the fixed priority queue.

      Parameters

      • data: T

        Data to enqueue.

        -
      • Optional priority: number

        Priority of the data. Lower values have higher priority.

        +
      • Optionalpriority: number

        Priority of the data. Lower values have higher priority.

      Returns number

      The new size of the priority queue.

      -

      Throws

      If the fixed priority queue is full.

      -
    • Gets data from the fixed priority queue.

      Parameters

      • index: number

        The index of the data to get.

      Returns undefined | T

      The data at the index or undefined if the fixed priority queue is empty or the index is out of bounds.

      -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/interfaces/PromiseResponseWrapper.html b/docs/interfaces/PromiseResponseWrapper.html index f79d16eb..d4689835 100644 --- a/docs/interfaces/PromiseResponseWrapper.html +++ b/docs/interfaces/PromiseResponseWrapper.html @@ -1,11 +1,11 @@ -PromiseResponseWrapper | poolifier - v4.0.15

    Interface PromiseResponseWrapper<Response>Internal

    An object holding the task execution response promise resolve/reject callbacks.

    -
    interface PromiseResponseWrapper<Response> {
        asyncResource?: AsyncResource;
        reject: ((reason?) => void);
        resolve: ((value) => void);
        workerNodeKey: number;
    }

    Type Parameters

    • Response = unknown

      Type of execution response. This can only be structured-cloneable data.

      -

    Properties

    asyncResource? +PromiseResponseWrapper | poolifier - v4.0.15

    Interface PromiseResponseWrapper<Response>Internal

    An object holding the task execution response promise resolve/reject callbacks.

    +
    interface PromiseResponseWrapper<Response> {
        asyncResource?: AsyncResource;
        reject: ((reason?: unknown) => void);
        resolve: ((value: Response | PromiseLike<Response>) => void);
        workerNodeKey: number;
    }

    Type Parameters

    • Response = unknown

      Type of execution response. This can only be structured-cloneable data.

      +

    Properties

    asyncResource?: AsyncResource

    The asynchronous resource used to track the task execution.

    -
    reject: ((reason?) => void)

    Reject callback to reject the promise.

    -

    Type declaration

      • (reason?): void
      • Parameters

        • Optional reason: unknown

        Returns void

    resolve: ((value) => void)

    Resolve callback to fulfill the promise.

    -

    Type declaration

    workerNodeKey: number

    The worker node key executing the task.

    -
    \ No newline at end of file +

    Properties

    asyncResource?: AsyncResource

    The asynchronous resource used to track the task execution.

    +
    reject: ((reason?: unknown) => void)

    Reject callback to reject the promise.

    +
    resolve: ((value: Response | PromiseLike<Response>) => void)

    Resolve callback to fulfill the promise.

    +
    workerNodeKey: number

    The worker node key executing the task.

    +
    \ No newline at end of file diff --git a/docs/interfaces/StrategyData.html b/docs/interfaces/StrategyData.html index 7187fc2e..0772d632 100644 --- a/docs/interfaces/StrategyData.html +++ b/docs/interfaces/StrategyData.html @@ -1,3 +1,3 @@ -StrategyData | poolifier - v4.0.15

    Interface StrategyDataInternal

    Worker choice strategy data.

    -
    interface StrategyData {
        virtualTaskEndTimestamp?: number;
    }

    Properties

    virtualTaskEndTimestamp?: number
    \ No newline at end of file +StrategyData | poolifier - v4.0.15

    Interface StrategyDataInternal

    Worker choice strategy data.

    +
    interface StrategyData {
        virtualTaskEndTimestamp?: number;
    }

    Properties

    virtualTaskEndTimestamp?: number
    \ No newline at end of file diff --git a/docs/interfaces/StrategyPolicy.html b/docs/interfaces/StrategyPolicy.html index 22a02f89..62dbf1f8 100644 --- a/docs/interfaces/StrategyPolicy.html +++ b/docs/interfaces/StrategyPolicy.html @@ -1,6 +1,6 @@ -StrategyPolicy | poolifier - v4.0.15

    Interface StrategyPolicyInternal

    Strategy policy.

    -
    interface StrategyPolicy {
        dynamicWorkerReady: boolean;
        dynamicWorkerUsage: boolean;
    }

    Properties

    dynamicWorkerReady +StrategyPolicy | poolifier - v4.0.15

    Interface StrategyPolicyInternal

    Strategy policy.

    +
    interface StrategyPolicy {
        dynamicWorkerReady: boolean;
        dynamicWorkerUsage: boolean;
    }

    Properties

    dynamicWorkerReady: boolean

    Expects the newly created dynamic worker to be flagged as ready.

    -
    dynamicWorkerUsage: boolean

    Expects tasks execution on the newly created dynamic worker.

    -
    \ No newline at end of file +

    Properties

    dynamicWorkerReady: boolean

    Expects the newly created dynamic worker to be flagged as ready.

    +
    dynamicWorkerUsage: boolean

    Expects tasks execution on the newly created dynamic worker.

    +
    \ No newline at end of file diff --git a/docs/interfaces/Task.html b/docs/interfaces/Task.html index 787abddb..3d0ef9a7 100644 --- a/docs/interfaces/Task.html +++ b/docs/interfaces/Task.html @@ -1,19 +1,20 @@ -Task | poolifier - v4.0.15

    Interface Task<Data>Internal

    Message object that is passed as a task between main worker and worker.

    -
    interface Task<Data> {
        data?: Data;
        name?: string;
        priority?: number;
        strategy?: "ROUND_ROBIN" | "LEAST_USED" | "LEAST_BUSY" | "LEAST_ELU" | "FAIR_SHARE" | "WEIGHTED_ROUND_ROBIN" | "INTERLEAVED_WEIGHTED_ROUND_ROBIN";
        taskId?: `${string}-${string}-${string}-${string}-${string}`;
        timestamp?: number;
        transferList?: readonly TransferListItem[];
    }

    Type Parameters

    • Data = unknown

      Type of data sent to the worker. This can only be structured-cloneable data.

      -

    Hierarchy (view full)

    Properties

    data? +Task | poolifier - v4.0.15

    Interface Task<Data>Internal

    Message object that is passed as a task between main worker and worker.

    +
    interface Task<Data> {
        data?: Data;
        name?: string;
        priority?: number;
        strategy?:
            | "ROUND_ROBIN"
            | "LEAST_USED"
            | "LEAST_BUSY"
            | "LEAST_ELU"
            | "FAIR_SHARE"
            | "WEIGHTED_ROUND_ROBIN"
            | "INTERLEAVED_WEIGHTED_ROUND_ROBIN";
        taskId?: `${string}-${string}-${string}-${string}-${string}`;
        timestamp?: number;
        transferList?: readonly TransferListItem[];
    }

    Type Parameters

    • Data = unknown

      Type of data sent to the worker. This can only be structured-cloneable data.

      +

    Hierarchy (view full)

    Properties

    data?: Data

    Task input data that will be passed to the worker.

    -
    name?: string

    Task name.

    -
    priority?: number

    Task priority. Lower values have higher priority.

    -

    Default Value

    0
    -
    -
    strategy?: "ROUND_ROBIN" | "LEAST_USED" | "LEAST_BUSY" | "LEAST_ELU" | "FAIR_SHARE" | "WEIGHTED_ROUND_ROBIN" | "INTERLEAVED_WEIGHTED_ROUND_ROBIN"

    Task worker choice strategy.

    -
    taskId?: `${string}-${string}-${string}-${string}-${string}`

    Task UUID.

    -
    timestamp?: number

    Timestamp.

    -
    transferList?: readonly TransferListItem[]

    Array of transferable objects.

    -
    \ No newline at end of file +

    Properties

    data?: Data

    Task input data that will be passed to the worker.

    +
    name?: string

    Task name.

    +
    priority?: number

    Task priority. Lower values have higher priority.

    +
    0
    +
    + +
    strategy?:
        | "ROUND_ROBIN"
        | "LEAST_USED"
        | "LEAST_BUSY"
        | "LEAST_ELU"
        | "FAIR_SHARE"
        | "WEIGHTED_ROUND_ROBIN"
        | "INTERLEAVED_WEIGHTED_ROUND_ROBIN"

    Task worker choice strategy.

    +
    taskId?: `${string}-${string}-${string}-${string}-${string}`

    Task UUID.

    +
    timestamp?: number

    Timestamp.

    +
    transferList?: readonly TransferListItem[]

    Array of transferable objects.

    +
    \ No newline at end of file diff --git a/docs/interfaces/TaskFunctionObject.html b/docs/interfaces/TaskFunctionObject.html index 4c40deb2..1f21d7a8 100644 --- a/docs/interfaces/TaskFunctionObject.html +++ b/docs/interfaces/TaskFunctionObject.html @@ -1,10 +1,10 @@ -TaskFunctionObject | poolifier - v4.0.15

    Interface TaskFunctionObject<Data, Response>

    Task function object.

    -
    interface TaskFunctionObject<Data, Response> {
        priority?: number;
        strategy?: "ROUND_ROBIN" | "LEAST_USED" | "LEAST_BUSY" | "LEAST_ELU" | "FAIR_SHARE" | "WEIGHTED_ROUND_ROBIN" | "INTERLEAVED_WEIGHTED_ROUND_ROBIN";
        taskFunction: TaskFunction<Data, Response>;
    }

    Type Parameters

    • Data = unknown

      Type of data sent to the worker. This can only be structured-cloneable data.

      +TaskFunctionObject | poolifier - v4.0.15

      Interface TaskFunctionObject<Data, Response>

      Task function object.

      +
      interface TaskFunctionObject<Data, Response> {
          priority?: number;
          strategy?:
              | "ROUND_ROBIN"
              | "LEAST_USED"
              | "LEAST_BUSY"
              | "LEAST_ELU"
              | "FAIR_SHARE"
              | "WEIGHTED_ROUND_ROBIN"
              | "INTERLEAVED_WEIGHTED_ROUND_ROBIN";
          taskFunction: TaskFunction<Data, Response>;
      }

      Type Parameters

      • Data = unknown

        Type of data sent to the worker. This can only be structured-cloneable data.

      • Response = unknown

        Type of execution response. This can only be structured-cloneable data.

        -

      Properties

    Properties

    priority?: number

    Task function priority. Lower values have higher priority.

    -
    strategy?: "ROUND_ROBIN" | "LEAST_USED" | "LEAST_BUSY" | "LEAST_ELU" | "FAIR_SHARE" | "WEIGHTED_ROUND_ROBIN" | "INTERLEAVED_WEIGHTED_ROUND_ROBIN"

    Task function worker choice strategy.

    -
    taskFunction: TaskFunction<Data, Response>

    Task function.

    -
    \ No newline at end of file +

    Properties

    priority?: number

    Task function priority. Lower values have higher priority.

    +
    strategy?:
        | "ROUND_ROBIN"
        | "LEAST_USED"
        | "LEAST_BUSY"
        | "LEAST_ELU"
        | "FAIR_SHARE"
        | "WEIGHTED_ROUND_ROBIN"
        | "INTERLEAVED_WEIGHTED_ROUND_ROBIN"

    Task function worker choice strategy.

    +
    taskFunction: TaskFunction<Data, Response>

    Task function.

    +
    \ No newline at end of file diff --git a/docs/interfaces/TaskFunctionOperationResult.html b/docs/interfaces/TaskFunctionOperationResult.html index e926cc2e..1ffba853 100644 --- a/docs/interfaces/TaskFunctionOperationResult.html +++ b/docs/interfaces/TaskFunctionOperationResult.html @@ -1,4 +1,4 @@ -TaskFunctionOperationResult | poolifier - v4.0.15

    Interface TaskFunctionOperationResult

    Task function operation result.

    -
    interface TaskFunctionOperationResult {
        error?: Error;
        status: boolean;
    }

    Properties

    error? +TaskFunctionOperationResult | poolifier - v4.0.15

    Interface TaskFunctionOperationResult

    Task function operation result.

    +
    interface TaskFunctionOperationResult {
        error?: Error;
        status: boolean;
    }

    Properties

    Properties

    error?: Error
    status: boolean
    \ No newline at end of file +

    Properties

    error?: Error
    status: boolean
    \ No newline at end of file diff --git a/docs/interfaces/TaskFunctionProperties.html b/docs/interfaces/TaskFunctionProperties.html index 648dfaa8..c9603cbd 100644 --- a/docs/interfaces/TaskFunctionProperties.html +++ b/docs/interfaces/TaskFunctionProperties.html @@ -1,8 +1,8 @@ -TaskFunctionProperties | poolifier - v4.0.15

    Interface TaskFunctionProperties

    Task function properties.

    -
    interface TaskFunctionProperties {
        name: string;
        priority?: number;
        strategy?: "ROUND_ROBIN" | "LEAST_USED" | "LEAST_BUSY" | "LEAST_ELU" | "FAIR_SHARE" | "WEIGHTED_ROUND_ROBIN" | "INTERLEAVED_WEIGHTED_ROUND_ROBIN";
    }

    Properties

    name +TaskFunctionProperties | poolifier - v4.0.15

    Interface TaskFunctionProperties

    Task function properties.

    +
    interface TaskFunctionProperties {
        name: string;
        priority?: number;
        strategy?:
            | "ROUND_ROBIN"
            | "LEAST_USED"
            | "LEAST_BUSY"
            | "LEAST_ELU"
            | "FAIR_SHARE"
            | "WEIGHTED_ROUND_ROBIN"
            | "INTERLEAVED_WEIGHTED_ROUND_ROBIN";
    }

    Properties

    name: string

    Task function name.

    -
    priority?: number

    Task function priority. Lower values have higher priority.

    -
    strategy?: "ROUND_ROBIN" | "LEAST_USED" | "LEAST_BUSY" | "LEAST_ELU" | "FAIR_SHARE" | "WEIGHTED_ROUND_ROBIN" | "INTERLEAVED_WEIGHTED_ROUND_ROBIN"

    Task function worker choice strategy.

    -
    \ No newline at end of file +

    Properties

    name: string

    Task function name.

    +
    priority?: number

    Task function priority. Lower values have higher priority.

    +
    strategy?:
        | "ROUND_ROBIN"
        | "LEAST_USED"
        | "LEAST_BUSY"
        | "LEAST_ELU"
        | "FAIR_SHARE"
        | "WEIGHTED_ROUND_ROBIN"
        | "INTERLEAVED_WEIGHTED_ROUND_ROBIN"

    Task function worker choice strategy.

    +
    \ No newline at end of file diff --git a/docs/interfaces/TaskPerformance.html b/docs/interfaces/TaskPerformance.html index d3717824..8e053b28 100644 --- a/docs/interfaces/TaskPerformance.html +++ b/docs/interfaces/TaskPerformance.html @@ -1,10 +1,10 @@ -TaskPerformance | poolifier - v4.0.15

    Interface TaskPerformanceInternal

    Task performance.

    -
    interface TaskPerformance {
        elu?: EventLoopUtilization;
        name: string;
        runTime?: number;
        timestamp: number;
    }

    Properties

    elu? +TaskPerformance | poolifier - v4.0.15

    Interface TaskPerformanceInternal

    Task performance.

    +
    interface TaskPerformance {
        elu?: EventLoopUtilization;
        name: string;
        runTime?: number;
        timestamp: number;
    }

    Properties

    elu?: EventLoopUtilization

    Task event loop utilization.

    -
    name: string

    Task name.

    -
    runTime?: number

    Task runtime.

    -
    timestamp: number

    Task performance timestamp.

    -
    \ No newline at end of file +

    Properties

    elu?: EventLoopUtilization

    Task event loop utilization.

    +
    name: string

    Task name.

    +
    runTime?: number

    Task runtime.

    +
    timestamp: number

    Task performance timestamp.

    +
    \ No newline at end of file diff --git a/docs/interfaces/TaskStatistics.html b/docs/interfaces/TaskStatistics.html index 7c489f57..c07cbd06 100644 --- a/docs/interfaces/TaskStatistics.html +++ b/docs/interfaces/TaskStatistics.html @@ -1,16 +1,16 @@ -TaskStatistics | poolifier - v4.0.15

    Interface TaskStatisticsInternal

    Task statistics.

    -
    interface TaskStatistics {
        executed: number;
        executing: number;
        failed: number;
        maxQueued?: number;
        queued: number;
        sequentiallyStolen: number;
        stolen: number;
    }

    Properties

    executed +TaskStatistics | poolifier - v4.0.15

    Interface TaskStatisticsInternal

    Task statistics.

    +
    interface TaskStatistics {
        executed: number;
        executing: number;
        failed: number;
        maxQueued?: number;
        queued: number;
        sequentiallyStolen: number;
        stolen: number;
    }

    Properties

    executed: number

    Number of executed tasks.

    -
    executing: number

    Number of executing tasks.

    -
    failed: number

    Number of failed tasks.

    -
    maxQueued?: number

    Maximum number of queued tasks.

    -
    queued: number

    Number of queued tasks.

    -
    sequentiallyStolen: number

    Number of sequentially stolen tasks.

    -
    stolen: number

    Number of stolen tasks.

    -
    \ No newline at end of file +

    Properties

    executed: number

    Number of executed tasks.

    +
    executing: number

    Number of executing tasks.

    +
    failed: number

    Number of failed tasks.

    +
    maxQueued?: number

    Maximum number of queued tasks.

    +
    queued: number

    Number of queued tasks.

    +
    sequentiallyStolen: number

    Number of sequentially stolen tasks.

    +
    stolen: number

    Number of stolen tasks.

    +
    \ No newline at end of file diff --git a/docs/interfaces/TaskStatisticsRequirements.html b/docs/interfaces/TaskStatisticsRequirements.html index 17b05404..06034c13 100644 --- a/docs/interfaces/TaskStatisticsRequirements.html +++ b/docs/interfaces/TaskStatisticsRequirements.html @@ -1,8 +1,8 @@ -TaskStatisticsRequirements | poolifier - v4.0.15

    Interface TaskStatisticsRequirementsInternal

    Pool worker node worker usage statistics requirements.

    -
    interface TaskStatisticsRequirements {
        elu: MeasurementStatisticsRequirements;
        runTime: MeasurementStatisticsRequirements;
        waitTime: MeasurementStatisticsRequirements;
    }

    Properties

    elu +TaskStatisticsRequirements | poolifier - v4.0.15

    Interface TaskStatisticsRequirementsInternal

    Pool worker node worker usage statistics requirements.

    +
    interface TaskStatisticsRequirements {
        elu: MeasurementStatisticsRequirements;
        runTime: MeasurementStatisticsRequirements;
        waitTime: MeasurementStatisticsRequirements;
    }

    Properties

    Properties

    Tasks event loop utilization requirements.

    -

    Tasks runtime requirements.

    -

    Tasks wait time requirements.

    -
    \ No newline at end of file +

    Properties

    Tasks event loop utilization requirements.

    +

    Tasks runtime requirements.

    +

    Tasks wait time requirements.

    +
    \ No newline at end of file diff --git a/docs/interfaces/TasksQueueOptions.html b/docs/interfaces/TasksQueueOptions.html index 750a6cc7..34e2dc80 100644 --- a/docs/interfaces/TasksQueueOptions.html +++ b/docs/interfaces/TasksQueueOptions.html @@ -1,22 +1,27 @@ -TasksQueueOptions | poolifier - v4.0.15

    Interface TasksQueueOptions

    Worker node tasks queue options.

    -
    interface TasksQueueOptions {
        concurrency?: number;
        size?: number;
        taskStealing?: boolean;
        tasksFinishedTimeout?: number;
        tasksStealingOnBackPressure?: boolean;
    }

    Properties

    concurrency? +TasksQueueOptions | poolifier - v4.0.15

    Interface TasksQueueOptions

    Worker node tasks queue options.

    +
    interface TasksQueueOptions {
        concurrency?: number;
        size?: number;
        taskStealing?: boolean;
        tasksFinishedTimeout?: number;
        tasksStealingOnBackPressure?: boolean;
    }

    Properties

    concurrency?: number

    Maximum number of tasks that can be executed concurrently on a worker node.

    -

    Default Value

    1
    -
    -
    size?: number

    Maximum tasks queue size per worker node flagging it as back pressured.

    -

    Default Value

    (pool maximum size)^2
    -
    -
    taskStealing?: boolean

    Whether to enable task stealing on idle.

    -

    Default Value

    true
    -
    -
    tasksFinishedTimeout?: number

    Queued tasks finished timeout in milliseconds at worker node termination.

    -

    Default Value

    2000
    -
    -
    tasksStealingOnBackPressure?: boolean

    Whether to enable tasks stealing under back pressure.

    -

    Default Value

    false
    -
    -
    \ No newline at end of file +

    Properties

    concurrency?: number

    Maximum number of tasks that can be executed concurrently on a worker node.

    +
    1
    +
    + +
    size?: number

    Maximum tasks queue size per worker node flagging it as back pressured.

    +
    (pool maximum size)^2
    +
    + +
    taskStealing?: boolean

    Whether to enable task stealing on idle.

    +
    true
    +
    + +
    tasksFinishedTimeout?: number

    Queued tasks finished timeout in milliseconds at worker node termination.

    +
    2000
    +
    + +
    tasksStealingOnBackPressure?: boolean

    Whether to enable tasks stealing under back pressure.

    +
    false
    +
    + +
    \ No newline at end of file diff --git a/docs/interfaces/WorkerChoiceStrategyOptions.html b/docs/interfaces/WorkerChoiceStrategyOptions.html index 3b40a5da..9146660c 100644 --- a/docs/interfaces/WorkerChoiceStrategyOptions.html +++ b/docs/interfaces/WorkerChoiceStrategyOptions.html @@ -1,21 +1,25 @@ -WorkerChoiceStrategyOptions | poolifier - v4.0.15

    Interface WorkerChoiceStrategyOptions

    Worker choice strategy options.

    -
    interface WorkerChoiceStrategyOptions {
        elu?: MeasurementOptions;
        measurement?: "runTime" | "waitTime" | "elu";
        runTime?: MeasurementOptions;
        waitTime?: MeasurementOptions;
        weights?: Record<number, number>;
    }

    Properties

    elu? +WorkerChoiceStrategyOptions | poolifier - v4.0.15

    Interface WorkerChoiceStrategyOptions

    Worker choice strategy options.

    +
    interface WorkerChoiceStrategyOptions {
        elu?: MeasurementOptions;
        measurement?: "runTime" | "waitTime" | "elu";
        runTime?: MeasurementOptions;
        waitTime?: MeasurementOptions;
        weights?: Record<number, number>;
    }

    Properties

    Event loop utilization options.

    -

    Default Value

    { median: false }
    -
    -
    measurement?: "runTime" | "waitTime" | "elu"

    Measurement to use in worker choice strategy supporting it.

    -

    Runtime options.

    -

    Default Value

    { median: false }
    -
    -

    Wait time options.

    -

    Default Value

    { median: false }
    -
    -
    weights?: Record<number, number>

    Worker weights to use for weighted round robin worker selection strategies. +

    Properties

    Event loop utilization options.

    +
    { median: false }
    +
    + +
    measurement?: "runTime" | "waitTime" | "elu"

    Measurement to use in worker choice strategy supporting it.

    +

    Runtime options.

    +
    { median: false }
    +
    + +

    Wait time options.

    +
    { median: false }
    +
    + +
    weights?: Record<number, number>

    Worker weights to use for weighted round robin worker selection strategies. A weight is tasks maximum execution time in milliseconds for a worker node.

    -

    Default Value

    Weights computed automatically given the CPU performance.
    -
    -
    \ No newline at end of file +
    Weights computed automatically given the CPU performance.
    +
    + +
    \ No newline at end of file diff --git a/docs/interfaces/WorkerError.html b/docs/interfaces/WorkerError.html index 9ab5ea57..4ee03edc 100644 --- a/docs/interfaces/WorkerError.html +++ b/docs/interfaces/WorkerError.html @@ -1,9 +1,9 @@ -WorkerError | poolifier - v4.0.15

    Interface WorkerError<Data>

    Worker error.

    +WorkerError | poolifier - v4.0.15

    Interface WorkerError<Data>

    Worker error.

    interface WorkerError<Data> {
        data?: Data;
        message: string;
        name: string;
    }

    Type Parameters

    • Data = unknown

      Type of data sent to the worker triggering an error. This can only be structured-cloneable data.

      -

    Properties

    Properties

    Properties

    data?: Data

    Data triggering the error.

    -
    message: string

    Error message.

    -
    name: string

    Task function name triggering the error.

    -
    \ No newline at end of file +

    Properties

    data?: Data

    Data triggering the error.

    +
    message: string

    Error message.

    +
    name: string

    Task function name triggering the error.

    +
    \ No newline at end of file diff --git a/docs/interfaces/WorkerInfo.html b/docs/interfaces/WorkerInfo.html index 09f2098c..aeca7dfe 100644 --- a/docs/interfaces/WorkerInfo.html +++ b/docs/interfaces/WorkerInfo.html @@ -1,18 +1,18 @@ -WorkerInfo | poolifier - v4.0.15

    Interface WorkerInfoInternal

    Worker information.

    -
    interface WorkerInfo {
        backPressure: boolean;
        dynamic: boolean;
        id: undefined | number;
        ready: boolean;
        stealing: boolean;
        taskFunctionsProperties?: TaskFunctionProperties[];
        type: "thread" | "cluster";
    }

    Properties

    backPressure +WorkerInfo | poolifier - v4.0.15

    Interface WorkerInfoInternal

    Worker information.

    +
    interface WorkerInfo {
        backPressure: boolean;
        dynamic: boolean;
        id: undefined | number;
        ready: boolean;
        stealing: boolean;
        taskFunctionsProperties?: TaskFunctionProperties[];
        type: "thread" | "cluster";
    }

    Properties

    backPressure: boolean

    Back pressure flag. +

    Properties

    backPressure: boolean

    Back pressure flag. This flag is set to true when worker node tasks queue has back pressure.

    -
    dynamic: boolean

    Dynamic flag.

    -
    id: undefined | number

    Worker id.

    -
    ready: boolean

    Ready flag.

    -
    stealing: boolean

    Stealing flag. +

    dynamic: boolean

    Dynamic flag.

    +
    id: undefined | number

    Worker id.

    +
    ready: boolean

    Ready flag.

    +
    stealing: boolean

    Stealing flag. This flag is set to true when worker node is stealing tasks from another worker node.

    -
    taskFunctionsProperties?: TaskFunctionProperties[]

    Task functions properties.

    -
    type: "thread" | "cluster"

    Worker type.

    -
    \ No newline at end of file +
    taskFunctionsProperties?: TaskFunctionProperties[]

    Task functions properties.

    +
    type: "thread" | "cluster"

    Worker type.

    +
    \ No newline at end of file diff --git a/docs/interfaces/WorkerNodeEventDetail.html b/docs/interfaces/WorkerNodeEventDetail.html index 153ded90..16427df3 100644 --- a/docs/interfaces/WorkerNodeEventDetail.html +++ b/docs/interfaces/WorkerNodeEventDetail.html @@ -1,4 +1,4 @@ -WorkerNodeEventDetail | poolifier - v4.0.15

    Interface WorkerNodeEventDetailInternal

    Worker node event detail.

    -
    interface WorkerNodeEventDetail {
        workerId?: number;
        workerNodeKey?: number;
    }

    Properties

    workerId? +WorkerNodeEventDetail | poolifier - v4.0.15

    Interface WorkerNodeEventDetailInternal

    Worker node event detail.

    +
    interface WorkerNodeEventDetail {
        workerId?: number;
        workerNodeKey?: number;
    }

    Properties

    workerId?: number
    workerNodeKey?: number
    \ No newline at end of file +

    Properties

    workerId?: number
    workerNodeKey?: number
    \ No newline at end of file diff --git a/docs/interfaces/WorkerNodeOptions.html b/docs/interfaces/WorkerNodeOptions.html index 5cb40a26..c3af2b4e 100644 --- a/docs/interfaces/WorkerNodeOptions.html +++ b/docs/interfaces/WorkerNodeOptions.html @@ -1,7 +1,7 @@ -WorkerNodeOptions | poolifier - v4.0.15

    Interface WorkerNodeOptionsInternal

    Worker node options.

    -
    interface WorkerNodeOptions {
        env?: Record<string, unknown>;
        tasksQueueBackPressureSize: undefined | number;
        tasksQueueBucketSize: undefined | number;
        tasksQueuePriority: undefined | boolean;
        workerOptions?: WorkerOptions;
    }

    Properties

    env? +WorkerNodeOptions | poolifier - v4.0.15

    Interface WorkerNodeOptionsInternal

    Worker node options.

    +
    interface WorkerNodeOptions {
        env?: Record<string, unknown>;
        tasksQueueBackPressureSize: undefined | number;
        tasksQueueBucketSize: undefined | number;
        tasksQueuePriority: undefined | boolean;
        workerOptions?: WorkerOptions;
    }

    Properties

    env?: Record<string, unknown>
    tasksQueueBackPressureSize: undefined | number
    tasksQueueBucketSize: undefined | number
    tasksQueuePriority: undefined | boolean
    workerOptions?: WorkerOptions
    \ No newline at end of file +

    Properties

    env?: Record<string, unknown>
    tasksQueueBackPressureSize: undefined | number
    tasksQueueBucketSize: undefined | number
    tasksQueuePriority: undefined | boolean
    workerOptions?: WorkerOptions
    \ No newline at end of file diff --git a/docs/interfaces/WorkerOptions.html b/docs/interfaces/WorkerOptions.html index 162d56c3..f5c68efa 100644 --- a/docs/interfaces/WorkerOptions.html +++ b/docs/interfaces/WorkerOptions.html @@ -1,18 +1,19 @@ -WorkerOptions | poolifier - v4.0.15

    Interface WorkerOptions

    Options for workers.

    -
    interface WorkerOptions {
        killBehavior?: "SOFT" | "HARD";
        killHandler?: KillHandler;
        maxInactiveTime?: number;
    }

    Properties

    killBehavior? +WorkerOptions | poolifier - v4.0.15

    Interface WorkerOptions

    Options for workers.

    +
    interface WorkerOptions {
        killBehavior?: "SOFT" | "HARD";
        killHandler?: KillHandler;
        maxInactiveTime?: number;
    }

    Properties

    killBehavior?: "SOFT" | "HARD"

    killBehavior dictates if your worker will be deleted in case a task is active on it.

    +

    Properties

    killBehavior?: "SOFT" | "HARD"

    killBehavior dictates if your worker will be deleted in case a task is active on it.

      -
    • SOFT: If currentTime - lastActiveTime is greater than maxInactiveTime but the worker is stealing tasks or a task is executing or queued, then the worker won't be deleted.
    • +
    • SOFT: If currentTime - lastActiveTime is greater than maxInactiveTime but the worker is stealing tasks or a task is executing or queued, then the worker won't be deleted.
    • HARD: If currentTime - lastActiveTime is greater than maxInactiveTime but the worker is stealing tasks or a task is executing or queued, then the worker will be deleted.

    This option only apply to the newly created workers.

    -

    Default Value

    KillBehaviors.SOFT
    -
    -
    killHandler?: KillHandler

    The function to call when a worker is killed.

    -

    Default Value

    () => {}

    -
    maxInactiveTime?: number

    Maximum waiting time in milliseconds for tasks on newly created workers. It must be greater or equal than 5.

    +
    KillBehaviors.SOFT
    +
    + +
    killHandler?: KillHandler

    The function to call when a worker is killed.

    +

    () => {}

    +
    maxInactiveTime?: number

    Maximum waiting time in milliseconds for tasks on newly created workers. It must be greater or equal than 5.

    After this time, newly created workers will be terminated. The last active time of your worker will be updated when it terminates a task.

      @@ -20,6 +21,7 @@ The last active time of your worker will be updated when it terminates a task.
    • If killBehavior is set to KillBehaviors.SOFT your tasks have no timeout and your workers will not be terminated until your task is completed.
    -

    Default Value

    60000
    -
    -
    \ No newline at end of file +
    60000
    +
    + +
    \ No newline at end of file diff --git a/docs/interfaces/WorkerStatistics.html b/docs/interfaces/WorkerStatistics.html index 6f9911e7..8ebee048 100644 --- a/docs/interfaces/WorkerStatistics.html +++ b/docs/interfaces/WorkerStatistics.html @@ -1,6 +1,6 @@ -WorkerStatistics | poolifier - v4.0.15

    Interface WorkerStatisticsInternal

    Worker task performance statistics computation settings.

    -
    interface WorkerStatistics {
        elu: boolean;
        runTime: boolean;
    }

    Properties

    elu +WorkerStatistics | poolifier - v4.0.15

    Interface WorkerStatisticsInternal

    Worker task performance statistics computation settings.

    +
    interface WorkerStatistics {
        elu: boolean;
        runTime: boolean;
    }

    Properties

    Properties

    elu: boolean

    Whether the worker computes the task event loop utilization (ELU) or not.

    -
    runTime: boolean

    Whether the worker computes the task runtime or not.

    -
    \ No newline at end of file +

    Properties

    elu: boolean

    Whether the worker computes the task event loop utilization (ELU) or not.

    +
    runTime: boolean

    Whether the worker computes the task runtime or not.

    +
    \ No newline at end of file diff --git a/docs/interfaces/WorkerUsage.html b/docs/interfaces/WorkerUsage.html index 02308be0..cb9615c8 100644 --- a/docs/interfaces/WorkerUsage.html +++ b/docs/interfaces/WorkerUsage.html @@ -1,10 +1,10 @@ -WorkerUsage | poolifier - v4.0.15

    Interface WorkerUsageInternal

    Worker usage statistics.

    -
    interface WorkerUsage {
        elu: EventLoopUtilizationMeasurementStatistics;
        runTime: MeasurementStatistics;
        tasks: TaskStatistics;
        waitTime: MeasurementStatistics;
    }

    Properties

    elu +WorkerUsage | poolifier - v4.0.15

    Interface WorkerUsageInternal

    Worker usage statistics.

    +
    interface WorkerUsage {
        elu: EventLoopUtilizationMeasurementStatistics;
        runTime: MeasurementStatistics;
        tasks: TaskStatistics;
        waitTime: MeasurementStatistics;
    }

    Properties

    Tasks event loop utilization statistics.

    -

    Tasks runtime statistics.

    -

    Tasks statistics.

    -

    Tasks wait time statistics.

    -
    \ No newline at end of file +

    Properties

    Tasks event loop utilization statistics.

    +

    Tasks runtime statistics.

    +

    Tasks statistics.

    +

    Tasks wait time statistics.

    +
    \ No newline at end of file diff --git a/docs/types/ClusterPoolOptions.html b/docs/types/ClusterPoolOptions.html index 8b40ce07..ba821889 100644 --- a/docs/types/ClusterPoolOptions.html +++ b/docs/types/ClusterPoolOptions.html @@ -1,2 +1,2 @@ -ClusterPoolOptions | poolifier - v4.0.15

    Type alias ClusterPoolOptions

    ClusterPoolOptions: PoolOptions<Worker>

    Options for a poolifier cluster pool.

    -
    \ No newline at end of file +ClusterPoolOptions | poolifier - v4.0.15

    Type Alias ClusterPoolOptions

    ClusterPoolOptions: PoolOptions<Worker>

    Options for a poolifier cluster pool.

    +
    \ No newline at end of file diff --git a/docs/types/ErrorHandler.html b/docs/types/ErrorHandler.html index fabbb7e5..b4e14b70 100644 --- a/docs/types/ErrorHandler.html +++ b/docs/types/ErrorHandler.html @@ -1,3 +1,3 @@ -ErrorHandler | poolifier - v4.0.15

    Type alias ErrorHandler<Worker>

    ErrorHandler<Worker>: ((this, error) => void)

    Callback invoked if the worker raised an error.

    +ErrorHandler | poolifier - v4.0.15

    Type Alias ErrorHandler<Worker>

    ErrorHandler<Worker>: ((this: Worker, error: Error) => void)

    Callback invoked if the worker raised an error.

    Type Parameters

    • Worker extends IWorker

      Type of worker.

      -

    Type declaration

      • (this, error): void
      • Parameters

        Returns void

    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/types/EventHandler.html b/docs/types/EventHandler.html index 95b348d1..0f35258b 100644 --- a/docs/types/EventHandler.html +++ b/docs/types/EventHandler.html @@ -1,3 +1,3 @@ -EventHandler | poolifier - v4.0.15

    Type alias EventHandler<Worker>

    Worker event handler.

    +EventHandler | poolifier - v4.0.15

    Type Alias EventHandler<Worker>

    EventHandler<Worker>:
        | OnlineHandler<Worker>
        | MessageHandler<Worker>
        | ErrorHandler<Worker>
        | ExitHandler<Worker>

    Worker event handler.

    Type Parameters

    • Worker extends IWorker

      Type of worker.

      -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/types/ExitHandler.html b/docs/types/ExitHandler.html index ee774d1e..16d6b486 100644 --- a/docs/types/ExitHandler.html +++ b/docs/types/ExitHandler.html @@ -1,3 +1,3 @@ -ExitHandler | poolifier - v4.0.15

    Type alias ExitHandler<Worker>

    ExitHandler<Worker>: ((this, exitCode) => void)

    Callback invoked when the worker exits successfully.

    +ExitHandler | poolifier - v4.0.15

    Type Alias ExitHandler<Worker>

    ExitHandler<Worker>: ((this: Worker, exitCode: number) => void)

    Callback invoked when the worker exits successfully.

    Type Parameters

    • Worker extends IWorker

      Type of worker.

      -

    Type declaration

      • (this, exitCode): void
      • Parameters

        Returns void

    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/types/KillBehavior.html b/docs/types/KillBehavior.html index baeb5fee..d73ea652 100644 --- a/docs/types/KillBehavior.html +++ b/docs/types/KillBehavior.html @@ -1,2 +1,2 @@ -KillBehavior | poolifier - v4.0.15

    Type alias KillBehavior

    KillBehavior: keyof typeof KillBehaviors

    Kill behavior.

    -
    \ No newline at end of file +KillBehavior | poolifier - v4.0.15

    Type Alias KillBehavior

    KillBehavior: keyof typeof KillBehaviors

    Kill behavior.

    +
    \ No newline at end of file diff --git a/docs/types/KillHandler.html b/docs/types/KillHandler.html index f4f5c420..ac32af6c 100644 --- a/docs/types/KillHandler.html +++ b/docs/types/KillHandler.html @@ -1,2 +1,2 @@ -KillHandler | poolifier - v4.0.15

    Type alias KillHandler

    KillHandler: (() => void | Promise<void>)

    Handler called when a worker is killed.

    -

    Type declaration

      • (): void | Promise<void>
      • Returns void | Promise<void>

    \ No newline at end of file +KillHandler | poolifier - v4.0.15

    Type Alias KillHandler

    KillHandler: (() => void | Promise<void>)

    Handler called when a worker is killed.

    +
    \ No newline at end of file diff --git a/docs/types/Measurement.html b/docs/types/Measurement.html index 78ac30f9..dfc00120 100644 --- a/docs/types/Measurement.html +++ b/docs/types/Measurement.html @@ -1,2 +1,2 @@ -Measurement | poolifier - v4.0.15

    Type alias Measurement

    Measurement: keyof typeof Measurements

    Measurement.

    -
    \ No newline at end of file +Measurement | poolifier - v4.0.15

    Type Alias Measurement

    Measurement: keyof typeof Measurements

    Measurement.

    +
    \ No newline at end of file diff --git a/docs/types/MessageHandler.html b/docs/types/MessageHandler.html index d011868b..2ff5df23 100644 --- a/docs/types/MessageHandler.html +++ b/docs/types/MessageHandler.html @@ -1,3 +1,3 @@ -MessageHandler | poolifier - v4.0.15

    Type alias MessageHandler<Worker>

    MessageHandler<Worker>: ((this, message) => void)

    Callback invoked if the worker has received a message.

    +MessageHandler | poolifier - v4.0.15

    Type Alias MessageHandler<Worker>

    MessageHandler<Worker>: ((this: Worker, message: unknown) => void)

    Callback invoked if the worker has received a message.

    Type Parameters

    • Worker extends IWorker

      Type of worker.

      -

    Type declaration

      • (this, message): void
      • Parameters

        Returns void

    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/types/OnlineHandler.html b/docs/types/OnlineHandler.html index 5cbf9d63..03da1b69 100644 --- a/docs/types/OnlineHandler.html +++ b/docs/types/OnlineHandler.html @@ -1,3 +1,3 @@ -OnlineHandler | poolifier - v4.0.15

    Type alias OnlineHandler<Worker>

    OnlineHandler<Worker>: ((this) => void)

    Callback invoked when the worker has started successfully.

    +OnlineHandler | poolifier - v4.0.15

    Type Alias OnlineHandler<Worker>

    OnlineHandler<Worker>: ((this: Worker) => void)

    Callback invoked when the worker has started successfully.

    Type Parameters

    • Worker extends IWorker

      Type of worker.

      -

    Type declaration

      • (this): void
      • Parameters

        Returns void

    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/types/PoolEvent.html b/docs/types/PoolEvent.html index b8e61a18..b1939550 100644 --- a/docs/types/PoolEvent.html +++ b/docs/types/PoolEvent.html @@ -1,2 +1,2 @@ -PoolEvent | poolifier - v4.0.15

    Type alias PoolEvent

    PoolEvent: keyof typeof PoolEvents

    Pool event.

    -
    \ No newline at end of file +PoolEvent | poolifier - v4.0.15

    Type Alias PoolEvent

    PoolEvent: keyof typeof PoolEvents

    Pool event.

    +
    \ No newline at end of file diff --git a/docs/types/PoolType.html b/docs/types/PoolType.html index 059eeb96..ac74e0f3 100644 --- a/docs/types/PoolType.html +++ b/docs/types/PoolType.html @@ -1,2 +1,2 @@ -PoolType | poolifier - v4.0.15

    Type alias PoolType

    PoolType: keyof typeof PoolTypes

    Pool type.

    -
    \ No newline at end of file +PoolType | poolifier - v4.0.15

    Type Alias PoolType

    PoolType: keyof typeof PoolTypes

    Pool type.

    +
    \ No newline at end of file diff --git a/docs/types/TaskAsyncFunction.html b/docs/types/TaskAsyncFunction.html index 7df56d74..38c0d115 100644 --- a/docs/types/TaskAsyncFunction.html +++ b/docs/types/TaskAsyncFunction.html @@ -1,7 +1,7 @@ -TaskAsyncFunction | poolifier - v4.0.15

    Type alias TaskAsyncFunction<Data, Response>

    TaskAsyncFunction<Data, Response>: ((data?) => Promise<Response>)

    Task asynchronous function that can be executed. +TaskAsyncFunction | poolifier - v4.0.15

    Type Alias TaskAsyncFunction<Data, Response>

    TaskAsyncFunction<Data, Response>: ((data?: Data) => Promise<Response>)

    Task asynchronous function that can be executed. This function must return a promise.

    Type Parameters

    • Data = unknown

      Type of data sent to the worker. This can only be structured-cloneable data.

    • Response = unknown

      Type of execution response. This can only be structured-cloneable data.

      -

    Type declaration

      • (data?): Promise<Response>
      • Parameters

        • Optional data: Data

          Data sent to the worker.

          -

        Returns Promise<Response>

    Returns

    Execution response promise.

    -
    \ No newline at end of file +

    Type declaration

      • (data?): Promise<Response>
      • Parameters

        • Optionaldata: Data

          Data sent to the worker.

          +

        Returns Promise<Response>

        Execution response promise.

        +
    \ No newline at end of file diff --git a/docs/types/TaskFunction.html b/docs/types/TaskFunction.html index 23d2e2e1..7d0070ea 100644 --- a/docs/types/TaskFunction.html +++ b/docs/types/TaskFunction.html @@ -1,5 +1,5 @@ -TaskFunction | poolifier - v4.0.15

    Type alias TaskFunction<Data, Response>

    Task function that can be executed. +TaskFunction | poolifier - v4.0.15

    Type Alias TaskFunction<Data, Response>

    Task function that can be executed. This function can be synchronous or asynchronous.

    Type Parameters

    • Data = unknown

      Type of data sent to the worker. This can only be structured-cloneable data.

    • Response = unknown

      Type of execution response. This can only be structured-cloneable data.

      -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/types/TaskFunctions.html b/docs/types/TaskFunctions.html index 9a00e505..a479b9f6 100644 --- a/docs/types/TaskFunctions.html +++ b/docs/types/TaskFunctions.html @@ -1,6 +1,6 @@ -TaskFunctions | poolifier - v4.0.15

    Type alias TaskFunctions<Data, Response>

    TaskFunctions<Data, Response>: Record<string, TaskFunction<Data, Response> | TaskFunctionObject<Data, Response>>

    Tasks functions that can be executed. +TaskFunctions | poolifier - v4.0.15

    Type Alias TaskFunctions<Data, Response>

    TaskFunctions<Data, Response>: Record<string, TaskFunction<Data, Response> | TaskFunctionObject<Data, Response>>

    Tasks functions that can be executed. The key is the name of the task function or task function object. The value is the task function or task function object.

    Type Parameters

    • Data = unknown

      Type of data sent to the worker. This can only be structured-cloneable data.

    • Response = unknown

      Type of execution response. This can only be structured-cloneable data.

      -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/types/TaskSyncFunction.html b/docs/types/TaskSyncFunction.html index 69a642d5..fd05ab81 100644 --- a/docs/types/TaskSyncFunction.html +++ b/docs/types/TaskSyncFunction.html @@ -1,6 +1,6 @@ -TaskSyncFunction | poolifier - v4.0.15

    Type alias TaskSyncFunction<Data, Response>

    TaskSyncFunction<Data, Response>: ((data?) => Response)

    Task synchronous function that can be executed.

    +TaskSyncFunction | poolifier - v4.0.15

    Type Alias TaskSyncFunction<Data, Response>

    TaskSyncFunction<Data, Response>: ((data?: Data) => Response)

    Task synchronous function that can be executed.

    Type Parameters

    • Data = unknown

      Type of data sent to the worker. This can only be structured-cloneable data.

    • Response = unknown

      Type of execution response. This can only be structured-cloneable data.

      -

    Type declaration

    Returns

    Execution response.

    -
    \ No newline at end of file +

    Type declaration

      • (data?): Response
      • Parameters

        • Optionaldata: Data

          Data sent to the worker.

          +

        Returns Response

        Execution response.

        +
    \ No newline at end of file diff --git a/docs/types/ThreadPoolOptions.html b/docs/types/ThreadPoolOptions.html index 59aca9b4..034f3738 100644 --- a/docs/types/ThreadPoolOptions.html +++ b/docs/types/ThreadPoolOptions.html @@ -1,2 +1,2 @@ -ThreadPoolOptions | poolifier - v4.0.15

    Type alias ThreadPoolOptions

    ThreadPoolOptions: PoolOptions<Worker>

    Options for a poolifier thread pool.

    -
    \ No newline at end of file +ThreadPoolOptions | poolifier - v4.0.15

    Type Alias ThreadPoolOptions

    ThreadPoolOptions: PoolOptions<Worker>

    Options for a poolifier thread pool.

    +
    \ No newline at end of file diff --git a/docs/types/WorkerChoiceStrategy.html b/docs/types/WorkerChoiceStrategy.html index a50df528..d3e0d6b9 100644 --- a/docs/types/WorkerChoiceStrategy.html +++ b/docs/types/WorkerChoiceStrategy.html @@ -1,2 +1,2 @@ -WorkerChoiceStrategy | poolifier - v4.0.15

    Type alias WorkerChoiceStrategy

    WorkerChoiceStrategy: keyof typeof WorkerChoiceStrategies

    Worker choice strategy.

    -
    \ No newline at end of file +WorkerChoiceStrategy | poolifier - v4.0.15

    Type Alias WorkerChoiceStrategy

    WorkerChoiceStrategy: keyof typeof WorkerChoiceStrategies

    Worker choice strategy.

    +
    \ No newline at end of file diff --git a/docs/types/WorkerType.html b/docs/types/WorkerType.html index e32514f8..3e58b43f 100644 --- a/docs/types/WorkerType.html +++ b/docs/types/WorkerType.html @@ -1,2 +1,2 @@ -WorkerType | poolifier - v4.0.15

    Type alias WorkerType

    WorkerType: keyof typeof WorkerTypes

    Worker type.

    -
    \ No newline at end of file +WorkerType | poolifier - v4.0.15

    Type Alias WorkerType

    WorkerType: keyof typeof WorkerTypes

    Worker type.

    +
    \ No newline at end of file diff --git a/docs/types/Writable.html b/docs/types/Writable.html index a11f8d09..6b36956d 100644 --- a/docs/types/Writable.html +++ b/docs/types/Writable.html @@ -1 +1 @@ -Writable | poolifier - v4.0.15

    Type alias Writable<T>

    Writable<T>: {
        -readonly [P in keyof T]: T[P]
    }

    Type Parameters

    • T
    \ No newline at end of file +Writable | poolifier - v4.0.15

    Type Alias Writable<T>

    Writable<T>: {
        -readonly [P in keyof T]: T[P]
    }

    Type Parameters

    • T
    \ No newline at end of file diff --git a/docs/variables/KillBehaviors.html b/docs/variables/KillBehaviors.html index 14e6c22c..c257ee88 100644 --- a/docs/variables/KillBehaviors.html +++ b/docs/variables/KillBehaviors.html @@ -1,2 +1,2 @@ -KillBehaviors | poolifier - v4.0.15

    Variable KillBehaviorsConst

    KillBehaviors: Readonly<{
        HARD: "HARD";
        SOFT: "SOFT";
    }> = ...

    Enumeration of kill behaviors.

    -

    Type declaration

    • HARD: "HARD"
    • SOFT: "SOFT"
    \ No newline at end of file +KillBehaviors | poolifier - v4.0.15

    Variable KillBehaviorsConst

    KillBehaviors: Readonly<{
        HARD: "HARD";
        SOFT: "SOFT";
    }> = ...

    Enumeration of kill behaviors.

    +
    \ No newline at end of file diff --git a/docs/variables/Measurements.html b/docs/variables/Measurements.html index 3ca92926..81de8d9b 100644 --- a/docs/variables/Measurements.html +++ b/docs/variables/Measurements.html @@ -1,2 +1,2 @@ -Measurements | poolifier - v4.0.15

    Variable MeasurementsConst

    Measurements: Readonly<{
        elu: "elu";
        runTime: "runTime";
        waitTime: "waitTime";
    }> = ...

    Enumeration of measurements.

    -

    Type declaration

    • elu: "elu"
    • runTime: "runTime"
    • waitTime: "waitTime"
    \ No newline at end of file +Measurements | poolifier - v4.0.15

    Variable MeasurementsConst

    Measurements: Readonly<{
        elu: "elu";
        runTime: "runTime";
        waitTime: "waitTime";
    }> = ...

    Enumeration of measurements.

    +
    \ No newline at end of file diff --git a/docs/variables/PoolEvents.html b/docs/variables/PoolEvents.html index 9c7b5d4f..7ee4ae0d 100644 --- a/docs/variables/PoolEvents.html +++ b/docs/variables/PoolEvents.html @@ -1,2 +1,2 @@ -PoolEvents | poolifier - v4.0.15

    Variable PoolEventsConst

    PoolEvents: Readonly<{
        backPressure: "backPressure";
        busy: "busy";
        destroy: "destroy";
        empty: "empty";
        error: "error";
        full: "full";
        ready: "ready";
        taskError: "taskError";
    }> = ...

    Enumeration of pool events.

    -

    Type declaration

    • backPressure: "backPressure"
    • busy: "busy"
    • destroy: "destroy"
    • empty: "empty"
    • error: "error"
    • full: "full"
    • ready: "ready"
    • taskError: "taskError"
    \ No newline at end of file +PoolEvents | poolifier - v4.0.15

    Variable PoolEventsConst

    PoolEvents: Readonly<{
        backPressure: "backPressure";
        busy: "busy";
        destroy: "destroy";
        empty: "empty";
        error: "error";
        full: "full";
        ready: "ready";
        taskError: "taskError";
    }> = ...

    Enumeration of pool events.

    +
    \ No newline at end of file diff --git a/docs/variables/PoolTypes.html b/docs/variables/PoolTypes.html index fe3eb72c..88820baf 100644 --- a/docs/variables/PoolTypes.html +++ b/docs/variables/PoolTypes.html @@ -1,2 +1,2 @@ -PoolTypes | poolifier - v4.0.15

    Variable PoolTypesConst

    PoolTypes: Readonly<{
        dynamic: "dynamic";
        fixed: "fixed";
    }> = ...

    Enumeration of pool types.

    -

    Type declaration

    • dynamic: "dynamic"
    • fixed: "fixed"
    \ No newline at end of file +PoolTypes | poolifier - v4.0.15

    Variable PoolTypesConst

    PoolTypes: Readonly<{
        dynamic: "dynamic";
        fixed: "fixed";
    }> = ...

    Enumeration of pool types.

    +
    \ No newline at end of file diff --git a/docs/variables/WorkerChoiceStrategies.html b/docs/variables/WorkerChoiceStrategies.html index 10615ad0..a035b65f 100644 --- a/docs/variables/WorkerChoiceStrategies.html +++ b/docs/variables/WorkerChoiceStrategies.html @@ -1,2 +1,2 @@ -WorkerChoiceStrategies | poolifier - v4.0.15

    Variable WorkerChoiceStrategiesConst

    WorkerChoiceStrategies: Readonly<{
        FAIR_SHARE: "FAIR_SHARE";
        INTERLEAVED_WEIGHTED_ROUND_ROBIN: "INTERLEAVED_WEIGHTED_ROUND_ROBIN";
        LEAST_BUSY: "LEAST_BUSY";
        LEAST_ELU: "LEAST_ELU";
        LEAST_USED: "LEAST_USED";
        ROUND_ROBIN: "ROUND_ROBIN";
        WEIGHTED_ROUND_ROBIN: "WEIGHTED_ROUND_ROBIN";
    }> = ...

    Enumeration of worker choice strategies.

    -

    Type declaration

    • FAIR_SHARE: "FAIR_SHARE"
    • INTERLEAVED_WEIGHTED_ROUND_ROBIN: "INTERLEAVED_WEIGHTED_ROUND_ROBIN"
    • LEAST_BUSY: "LEAST_BUSY"
    • LEAST_ELU: "LEAST_ELU"
    • LEAST_USED: "LEAST_USED"
    • ROUND_ROBIN: "ROUND_ROBIN"
    • WEIGHTED_ROUND_ROBIN: "WEIGHTED_ROUND_ROBIN"
    \ No newline at end of file +WorkerChoiceStrategies | poolifier - v4.0.15

    Variable WorkerChoiceStrategiesConst

    WorkerChoiceStrategies: Readonly<{
        FAIR_SHARE: "FAIR_SHARE";
        INTERLEAVED_WEIGHTED_ROUND_ROBIN: "INTERLEAVED_WEIGHTED_ROUND_ROBIN";
        LEAST_BUSY: "LEAST_BUSY";
        LEAST_ELU: "LEAST_ELU";
        LEAST_USED: "LEAST_USED";
        ROUND_ROBIN: "ROUND_ROBIN";
        WEIGHTED_ROUND_ROBIN: "WEIGHTED_ROUND_ROBIN";
    }> = ...

    Enumeration of worker choice strategies.

    +
    \ No newline at end of file diff --git a/docs/variables/WorkerTypes.html b/docs/variables/WorkerTypes.html index 1d5279f9..bc9c6f3e 100644 --- a/docs/variables/WorkerTypes.html +++ b/docs/variables/WorkerTypes.html @@ -1,2 +1,2 @@ -WorkerTypes | poolifier - v4.0.15

    Variable WorkerTypesConst

    WorkerTypes: Readonly<{
        cluster: "cluster";
        thread: "thread";
    }> = ...

    Enumeration of worker types.

    -

    Type declaration

    • cluster: "cluster"
    • thread: "thread"
    \ No newline at end of file +WorkerTypes | poolifier - v4.0.15

    Variable WorkerTypesConst

    WorkerTypes: Readonly<{
        cluster: "cluster";
        thread: "thread";
    }> = ...

    Enumeration of worker types.

    +
    \ No newline at end of file