ixfx
Version:
Bundle of ixfx libraries
8 lines • 28 kB
JavaScript
import{n as e}from"./chunk-BKBlUVio.js";import{F as t,H as n,R as r,h as i,jt as a,m as o,n as s,o as c,s as l}from"./src-DlHqXvlb.js";import{A as u,C as d,M as f,P as p,v as m}from"./src-CrVWx2VD.js";import{a as h,n as g,s as _}from"./src-BnFVBvwz.js";import{_ as ee,h as te,s as ne}from"./src-BGZztchK.js";import{y as re}from"./src-ZyALqz2x.js";import{n as v}from"./src-CIW3LrR8.js";import{E as ie,rt as ae}from"./src-CWZAMrn_.js";const y=(e,t=``)=>typeof e==`object`&&`name`in e&&e.name!==void 0?e.name:t;function*b(e,t){t===void 0&&(t=y(e));for(let[n,r]of S(e))yield[r,t];for(let[n,r]of S(e)){let e=y(r,`?`);yield*b(r,t.length>0?t+`.`+e:e)}}function*x(e,t){t===void 0&&(t=y(e));for(let[n,r]of S(e)){let e;if(typeof r==`string`)e=t;else{let n=y(r,`?`);e=t.length>0?t+`.`+n:n}yield[r,e],yield*x(r,e)}}function oe(e){return e.seq!==void 0}function se(e){return e.sel!==void 0}function*S(e){if(oe(e))yield*e.seq.entries();else if(se(e))yield*e.sel.entries();else if(typeof e!=`string`)throw TypeError(`Unexpected shape of node. seq/sel missing`)}const C=async(e,t)=>{let n=typeof t==`number`?{millis:t}:t,r=n.delay??`before`;(r===`before`||r===`both`)&&await s(n);let i=Promise.resolve(await e());return(r===`after`||r===`both`)&&await s(n),i};async function*ce(){let e,t=new Promise(t=>e=t),n=0,r=()=>{e&&e(),t=new Promise(t=>e=t)};try{for(;;)n=globalThis.requestAnimationFrame(r),yield await t}finally{e&&e(),globalThis.cancelAnimationFrame(n)}}async function*le(e){let t=i(e);if(t===void 0)throw Error(`timeout is undefined`);if(t<0)throw Error(`Timeout is less than zero`);if(t===0)return yield*ce();let n,r=new Promise(e=>n=e),a,o=()=>{n&&n(),r=new Promise(e=>n=e)};try{for(;;)a=globalThis.setTimeout(o,t),yield await r}finally{n&&n(),a!==void 0&&globalThis.clearTimeout(a),a=void 0}}function ue(e,t,n){let r;return(...a)=>{r&&clearTimeout(r),r=setTimeout(()=>{try{let t=e(...a);n&&n({success:!0,value:t})}catch(e){n&&n({success:!1,error:e})}},i(t))}}var de=class{#e;#t=0;#n=Math.floor(Math.random()*100);constructor(){this.#e=[]}isEmpty(){return this.#e.length===0}add(e,t={}){this.#t++;let n=t.once??!1,r={id:`${this.#n} - ${this.#t}`,handler:e,once:n};return this.#e.push(r),r.id}remove(e){let t=this.#e.length;return this.#e=this.#e.filter(t=>t.id!==e),this.#e.length!==t}notify(e){for(let t of this.#e){let n=t.handler(e);if(typeof n==`boolean`){if(n)return t.once&&this.remove(t.id),!0}else t.once&&this.remove(t.id)}return!1}clear(){this.#e=[]}};const fe=(e,t)=>{f(m(e,`positive`,`nth`));let n=0;return r=>(n++,n===e?(n=0,t&&t(r),!0):!1)},w=async(e,t={},n)=>{let r=[],i=t.rank??a,o=Array.isArray(e)?e:[e];t.shuffle&&(o=ee(o));for(let e=0;e<o.length;e++){let a=o[e],s;if(s=typeof a==`function`?await a(n):a,s!==void 0&&(r.push(s),r.sort(i)),t.stop!==void 0&&t.stop(s,r))break}return t.filter?r.filter(t.filter):r},pe=async(e,t={},n)=>{let r=await w(e,t,n);if(!r||r.length===0)return;let i=t.at??-1;return r.at(i)},me=(e,t,n={})=>{let r=n.timeoutMs??601e3,i=n.signal,a=!1,o=!1,s;return new Promise((n,c)=>{let l=e=>{`type`in e?t.includes(e.type)?(a=!0,n(e),u()):console.warn(`eventRace: Got event '${e.type}' that is not in race list`):(console.warn(`eventRace: Event data does not have expected 'type' field`),console.log(e))};for(let n of t)e.addEventListener(n,l);let u=()=>{if(!o){s!==void 0&&clearTimeout(s),s=void 0,o=!0;for(let n of t)e.removeEventListener(n,l)}};s=setTimeout(()=>{a||o||(u(),c(Error(`eventRace: Events not fired within interval. Events: ${JSON.stringify(t)} Interval: ${r}`)))},r),i?.addEventListener(`abort`,()=>{a||o||(u(),c(Error(`Abort signal received ${i.reason}`)))})})},he=e=>{let t=ie(),n=A({...e,whatToCall:e=>{t(e)},fallback(){return e.default??0}});return e=>(n(e),t())};var T=class extends v{_lastUpdate;_pool;_state;_userExpireAfterMs;constructor(e,t){super(),this.key=e,this.resource=t,this._lastUpdate=performance.now(),this._pool=t.pool,this._userExpireAfterMs=this._pool.userExpireAfterMs,this._state=`idle`,this._pool.log.log(`PoolUser ctor key: ${this.key}`)}toString(){return this.isDisposed?`PoolUser. State: disposed`:`PoolUser. State: ${this._state} Elapsed: ${performance.now()-this._lastUpdate} Data: ${JSON.stringify(this.resource.data)}`}keepAlive(){if(this._state===`disposed`)throw Error(`PoolItem disposed`);this._lastUpdate=performance.now()}_dispose(e,t){if(this._state===`disposed`)return;let n=this.resource;this._state=`disposed`,n._release(this),this._pool.log.log(`PoolUser dispose key: ${this.key} reason: ${e}`),this.fireEvent(`disposed`,{data:t,reason:e}),super.clearEventListeners()}release(e){if(this.isDisposed)throw Error(`User disposed`);let t=this.resource.data;this._pool.log.log(`PoolUser release key: ${this.key} reason: ${e}`),this.fireEvent(`released`,{data:t,reason:e}),this._dispose(`release-${e}`,t)}get data(){if(this.isDisposed)throw Error(`User disposed`);return this.resource.data}get isExpired(){return this._userExpireAfterMs>0?performance.now()>this._lastUpdate+this._userExpireAfterMs:!1}get elapsed(){return performance.now()-this._lastUpdate}get isDisposed(){return this._state===`disposed`}get isValid(){return!(this.isDisposed||this.isExpired||this.resource.isDisposed)}},E=class{#e;#t;#n;#r;#i;#a;constructor(e,t){if(this.pool=e,t===void 0)throw Error(`Parameter 'data' is undefined`);if(e===void 0)throw Error(`Parameter 'pool' is undefined`);this.#t=t,this.#a=0,this.#i=e.resourcesWithoutUserExpireAfterMs,this.#r=e.capacityPerResource,this.#n=[],this.#e=`idle`}get data(){if(this.#e===`disposed`)throw Error(`Resource disposed`);return this.#t}updateData(e){if(this.#e===`disposed`)throw Error(`Resource disposed`);if(e===void 0)throw Error(`Parameter 'data' is undefined`);this.#t=e}toString(){return`Resource (expired: ${this.isExpiredFromUsers} users: ${this.#n.length}, state: ${this.#e}) data: ${JSON.stringify(this.data)}`}_assign(e){if(this.#n.find(t=>t===e||t.key===e.key))throw Error(`User instance already assigned to resource`);this.#n.push(e),this.#a=performance.now()}_release(e){this.#n=this.#n.filter(t=>t!==e),this.pool._release(e),this.#a=performance.now()}get hasUserCapacity(){return this.usersCount<this.#r}get usersCount(){return this.#n.length}get isExpiredFromUsers(){return this.#i<=0||this.#n.length>0?!1:performance.now()>this.#i+this.#a}get isDisposed(){return this.#e===`disposed`}dispose(e){if(this.#e===`disposed`)return;let t=this.#t;this.#e=`disposed`,this.pool.log.log(`Resource disposed (${e})`);for(let n of this.#n)n._dispose(`resource-${e}`,t);this.#n=[],this.#a=performance.now(),this.pool._releaseResource(this,e),this.pool.freeResource&&this.pool.freeResource(t)}},D=class{_resources;_users;capacity;userExpireAfterMs;resourcesWithoutUserExpireAfterMs;capacityPerResource;fullPolicy;generateResource;freeResource;log=h(`Pool`);constructor(e={}){this.capacity=e.capacity??-1,this.fullPolicy=e.fullPolicy??`error`,this.capacityPerResource=e.capacityPerResource??1,this.userExpireAfterMs=e.userExpireAfterMs??-1,this.resourcesWithoutUserExpireAfterMs=e.resourcesWithoutUserExpireAfterMs??-1,this.generateResource=e.generate,this.freeResource=e.free,this._users=new Map,this._resources=[],this.log=h(`Pool`,e.debug??!1);let t=Math.max(this.userExpireAfterMs,this.resourcesWithoutUserExpireAfterMs);t>0&&setInterval(()=>{this.maintain()},t*1.1)}dumpToString(){let e=`Pool
capacity: ${this.capacity} userExpireAfterMs: ${this.userExpireAfterMs} capacityPerResource: ${this.capacityPerResource}
resources count: ${this._resources.length}`,t=this._resources.map(e=>e.toString()).join(`\r
`);e+=`\r
Resources:\r
`+t,e+=`\r
Users: \r
`;for(let[t,n]of this._users.entries())e+=`\tk: ${t} v: ${n.toString()}\r\n`;return e}getUsersByLongestElapsed(){return[...this._users.values()].sort((e,t)=>{let n=e.elapsed,r=t.elapsed;return n===r?0:n<r?1:-1})}getResourcesSortedByUse(){return[...this._resources].sort((e,t)=>e.usersCount===t.usersCount?0:e.usersCount<t.usersCount?-1:1)}addResource(e){if(e===void 0)throw Error(`Cannot add undefined resource`);if(e===null)throw TypeError(`Cannot add null resource`);if(this.capacity>0&&this._resources.length===this.capacity)throw Error(`Capacity limit (${this.capacity}) reached. Cannot add more.`);this.log.log(`Adding resource: ${JSON.stringify(e)}`);let t=new E(this,e);return this._resources.push(t),t}maintain(){let e=!1,t=[];for(let e of this._resources)e.isDisposed?(this.log.log(`Maintain, disposed resource: ${JSON.stringify(e.data)}`),t.push(e)):e.isExpiredFromUsers&&(this.log.log(`Maintain, expired resource: ${JSON.stringify(e.data)}`),t.push(e));if(t.length>0){for(let e of t)e.dispose(`diposed/expired`);e=!0}let n=[];for(let[e,t]of this._users.entries())t.isValid||(this.log.log(`Maintain. Invalid user: ${t.key} (Disposed: ${t.isDisposed} Expired: ${t.isExpired} Resource disposed: ${t.resource.isDisposed})`),n.push(e),t._dispose(`invalid`,t.data));for(let t of n)this._users.delete(t),e=!0;e&&this.log.log(`End: resource len: ${this._resources.length} users: ${this.usersLength}`)}*resources(){let e=[...this._resources];for(let t of e)yield t}*values(){let e=[...this._resources];for(let t of e)yield t.data}release(e,t){let n=this._users.get(e);n&&n.release(t??`Pool.release`)}_release(e){this._users.delete(e.key)}_releaseResource(e,t){this._resources=this._resources.filter(t=>t!==e)}hasResource(e){return this._resources.find(t=>t.data===e)!==void 0}hasUser(e){return this._users.has(e)}_assign(e,t){let n=new T(e,t);return this._users.set(e,n),t._assign(n),n}#e(e){let t=this.getResourcesSortedByUse();if(t.length>0&&t[0].hasUserCapacity)return this._assign(e,t[0]);if(this.generateResource&&(this.capacity<0||this._resources.length<this.capacity)){this.log.log(`capacity: ${this.capacity} resources: ${this._resources.length}`);let t=this.addResource(this.generateResource());return this._assign(e,t)}}get usersLength(){return[...this._users.values()].length}useValue(e){return this.use(e).resource.data}use(e){let t=this._users.get(e);if(t)return t.keepAlive(),t;this.maintain();let n=this.#e(e);if(n)return n;if(this.fullPolicy===`error`)throw Error(`Pool is fully used (fullPolicy: ${this.fullPolicy}, capacity: ${this.capacity})`);if(this.fullPolicy===`evictOldestUser`){let t=this.getUsersByLongestElapsed();if(t.length>0){this.release(t[0].key,`evictedOldestUser`);let n=this.#e(e);if(n)return n}}throw Error(`Pool is fully used (${this.fullPolicy})`)}};const ge=(e={})=>new D(e);function O(){let e,t;return{promise:new Promise((n,r)=>{e=n,t=r}),resolve:e,reject:t}}const k=(e,t)=>{if(e===void 0)throw Error(`callback parameter is undefined`);f(m(i(t),`aboveZero`,`interval`));let n,r=0,a=0,o=0,s=`idle`,c=()=>{r=0,globalThis.clearTimeout(n),s=`idle`},l=async(l=t,f)=>new Promise((t,h)=>{r=performance.now();let g=i(l),_=m(g,`aboveZero`,`altTimeoutMs`);if(u(_)){h(p(_));return}switch(s){case`scheduled`:d();break;case`running`:break}s=`scheduled`,n=globalThis.setTimeout(async()=>{if(s!==`scheduled`){console.warn(`Timeout skipping execution since state is not 'scheduled'`),c();return}let n=f??[];a++,o++,s=`running`,await e(performance.now()-r,...n),s=`idle`,c(),t()},g)}),d=()=>{s!==`idle`&&c()};return{start:l,cancel:d,get runState(){return s},get startCount(){return a},get startCountTotal(){return o}}},A=e=>{let t=!1,n=k(()=>{t||(n.start(),e.whatToCall(e.fallback()))},e.interval);return e.abort&&e.abort.addEventListener(`abort`,e=>{t=!0,n.cancel()}),n.start(),r=>{if(t)throw Error(`AbortSignal has been fired`);n.start(),e.whatToCall(r)}};async function*j(e,t){let n=t.signal??void 0,r=t.delayWhen??`before`,a=t.count??void 0,o=t.allowUndefined??!1,l=t.delayMinimum?i(t.delayMinimum):void 0,u=t.while,d=!1,f=i(t.delay,i(t.delayMinimum,0)),p=performance.now(),m=async()=>{let e=performance.now()-p;if(l!==void 0&&(f=Math.max(0,l-e)),f&&await s({millis:f,signal:n}),p=performance.now(),n?.aborted)throw Error(`Signal aborted ${n.reason}`)};Array.isArray(e)&&(e=e.values()),t.onStart&&t.onStart();let h=!0,g=0;try{for(;!d;){g++,(r===`before`||r===`both`)&&await m();let t=await c(e);t===void 0&&!o?d=!0:(yield t,(r===`after`||r===`both`)&&await m(),a!==void 0&&g>=a&&(d=!0)),u&&(u(g)||(d=!0))}h=!1}finally{d=!0,t.onComplete&&t.onComplete(h)}}function*M(e,t){let n=t.signal??void 0,r=t.count??void 0,i=t.allowUndefined??!1,a=!1;Array.isArray(e)&&(e=e.values()),t.onStart&&t.onStart();let o=!0,s=0;try{for(;!a;){s++;let t=l(e);t===void 0&&!i?a=!0:(yield t,r!==void 0&&s>=r&&(a=!0),n?.aborted&&(a=!0))}o=!1}finally{a=!0,t.onComplete&&t.onComplete(o)}}var N=class extends v{timeoutMs;whenUnmatchedResponse;keyRequest;keyResponse;#e=new Map;#t;constructor(e={}){if(super(),typeof window>`u`&&(globalThis.window={setTimeout,clearTimeout}),this.timeoutMs=e.timeoutMs??1e3,this.whenUnmatchedResponse=e.whenUnmatchedResponse??`throw`,this.#t=n(()=>this.#n(),Math.floor(this.timeoutMs*1.2)),e.key){if(e.keyRequest)throw Error(`Cannot set 'keyRequest' when 'key' is set `);if(e.keyResponse)throw Error(`Cannot set 'keyResponse' when 'key' is set `);this.keyRequest=e.key,this.keyResponse=e.key}else{if(!e.keyRequest||!e.keyResponse)throw Error(`Expects 'keyRequest' & 'keyResponse' fields to be set if 'key' is not set`);this.keyRequest=e.keyRequest,this.keyResponse=e.keyResponse}}dispose(){this.#t.cancel();for(let e of this.#e.values())e.promiseReject&&e.promiseReject(`Request timeout`);this.#e.clear()}#n(){let e=[...this.#e.values()],t=Date.now();for(let n of e)if(n.expiresAt<=t){n.promiseReject&&n.promiseReject(`Request timeout`);let e=n.callback;e&&e(!0,`Request timeout`),this.fireEvent(`completed`,{request:n.req,response:`Request timeout`,success:!1}),this.#e.delete(n.id)}return this.#e.size>0}debugDump(){let e=[...this.#e.values()],t=Date.now();for(let n of e){let e=t-n.expiresAt;console.log(`${n.id} Expires in: ${Math.floor(e/1e3).toString()}s`)}}request(e,t){if(t!==void 0){this.#i(e,t);return}let n=this.keyRequest(e);if(this.#e.has(n))throw Error(`Already a request pending with id '${n}'`);return this.#r(n,e)}requestAndForget(e){let t=this.keyRequest(e);if(this.#e.has(t))throw Error(`Already a request pending with id '${t}'`);let n={expiresAt:Date.now()+this.timeoutMs,id:t,req:e};this.#e.set(t,n),this.#t.start()}#r(e,t){if(this.#e.has(e))throw Error(`Already a request pending with id '${e}'`);return new Promise((n,r)=>{let i={expiresAt:Date.now()+this.timeoutMs,id:e,req:t,promiseResolve:n,promiseReject:r};this.#e.set(e,i),this.#t.start()})}#i(e,t){let n=this.keyRequest(e);if(this.#e.has(n))throw Error(`Already a request pending with id '${n}'`);let r={expiresAt:Date.now()+this.timeoutMs,id:n,req:e,callback:t};this.#e.set(n,r),this.#t.start()}response(e,t){let n=this.keyResponse(e),r=this.#e.get(n);if(!r){if(this.whenUnmatchedResponse===`throw`)throw Error(`Unmatched response with id: '${n}'`,{cause:e});return!1}return t?r.expiresAt=Date.now()+this.timeoutMs:this.#e.delete(n),r.promiseResolve&&r.promiseResolve(e),r.callback&&r.callback(!1,e),this.fireEvent(`match`,{request:r.req,response:e}),t||this.fireEvent(`completed`,{request:r.req,response:e,success:!0}),!0}};function*P(e={}){let t=e.startAt??1,n=e.limitAttempts??2**53-1,r=e.limitValue,i=e.power??1.1,a=t;for(f(m(n,`aboveZero`,`limitAttempts`),d(t,``,`startAt`),d(n,``,`limitAttempts`),()=>r===void 0?void 0:d(r,``,`limitValue`),d(i,``,`power`));n>0;){if(r&&a>=r)return;n--,yield a,a+=a**i}}function F(e,t={}){return I({async probe(){try{let n=await e();return n===void 0?{value:t.taskValueFallback,error:`Fallback`,success:!1}:{value:n,success:!0}}catch(e){return{success:!1,error:e}}}},t)}async function I(e,t={}){let n=t.abort,i=_(t.log),a=t.predelayMs??0,c=r(),l=0,u=t.startAt??1e3,d=t.limitAttempts??2**53-1,f=P({...t,startAt:u,limitAttempts:d});if(u<=0)throw Error(`Param 'initialValue' must be above zero`);if(a>0)try{await s({millis:a,signal:n})}catch(e){return{success:!1,attempts:l,value:t.taskValueFallback,elapsed:c(),message:g(e)}}for(let r of f){l++;let a=await e.probe(l);if(a.success)return{success:a.success,value:a.value,attempts:l,elapsed:c()};if(i({msg:`retry attempts: ${l.toString()} t: ${o(r)}`}),l>=d)break;try{await s({millis:r,signal:n})}catch(e){return{success:!1,attempts:l,value:t.taskValueFallback,message:g(e),elapsed:c()}}}return{message:`Giving up after ${l.toString()} attempts.`,success:!1,attempts:l,value:t.taskValueFallback,elapsed:c()}}const L=e=>{let t=!1,n=!1;return()=>t?n:(t=!0,n=e(),n)};var R=class{#e;#t;#n;signal(){this.#e&&=(this.#e(),void 0),this.#n=Promise.resolve()}flush(){this.#t&&=(this.#t(`Flushed`),void 0),this.#e=void 0,this.#n=void 0}#r(){let e=new Promise((e,t)=>{this.#e=e,this.#t=t});return this.#n=e,e}async forSignal(e){let t=this.#n;if(t??=this.#r(),e){let t=this.#t;setTimeout(()=>{t&&t(`Timeout elapsed ${e.toString()}`)},e)}await t,this.#n=void 0,this.#e=void 0,this.#t=void 0}async didSignal(e){try{return await this.forSignal(e),!0}catch{return!1}}},_e=class e extends v{static shared=new e;_loop;_queue;constructor(){super(),this._queue=re(),this._loop=n(()=>this.processQueue(),100)}enqueue(e){let t=this._queue.enqueue(e);return this._loop.runState===`idle`&&(this.fireEvent(`started`,{}),this._loop.start()),t}async processQueue(){let e=this._queue.dequeue();if(e===void 0)return this.fireEvent(`empty`,{}),!1;try{let t=await e();this.fireEvent(`progress`,{task:e,remaining:this._queue.length,result:t})}catch(t){this.fireEvent(`error`,{error:t,task:e})}return!0}clear(){this._queue.length!==0&&(this._queue.clear(),this._loop.cancel(),this.fireEvent(`empty`,{}))}get isEmpty(){return this._queue.isEmpty}get length(){return this._queue.length}get runState(){return this._loop.runState}};const ve=(e,t)=>{let n=0;return async(...r)=>{let i=performance.now()-n;if(i>=t){let t=e(i,...r);typeof t==`object`&&await t,n=performance.now()}}};function ye(e){let t=V(i(e,0),{timer:H(),clampValue:!0});return()=>t.isDone}function be(e,t={}){let n=i(e);if(!n)throw Error(`Param 'duration' not valid`);let r={clampValue:t.clampValue,wrapValue:t.wrapValue,timer:t.timer??H()},a;return()=>(a??=V(n,r),a.elapsed)}function xe(e,t={}){let n={...t,timer:U()},r;return()=>(r??=V(e,n),r.elapsed)}const z=()=>({elapsed:1,isDone:!0,reset(){},mod(e){}}),B=()=>({elapsed:0,isDone:!1,reset(){},mod(){}}),V=(e,t={})=>{if(!Number.isFinite(e))return z();if(Number.isNaN(e))return B();let n=t.clampValue??!1,r=t.wrapValue??!1;if(n&&r)throw Error(`clampValue and wrapValue cannot both be enabled`);let i=1,a=t.timer??H(),o=0,s=t=>{o=t;let a=t/(e*i);return n?a=ae(a):r&&a>=1&&(a%=1),a};return{mod(e){i=e},get isDone(){return s(o)>=1},get elapsed(){return s(a.elapsed)},reset:()=>{a.reset()}}},Se=(e,t={})=>{let n=t.timer??H(),r=e/1e3,i=1,a=()=>{let e=n.elapsed*(r*i),t=e-Math.floor(e);if(t<0)throw Error(`Unexpected cycle fraction less than 0. Elapsed: ${e} f: ${t}`);if(t>1)throw Error(`Unexpected cycle fraction more than 1. Elapsed: ${e} f: ${t}`);return t};return{mod:e=>{i=e},reset:()=>{n.reset()},get isDone(){return a()>=1},get elapsed(){return a()}}},H=()=>{let e=performance.now();return{reset:()=>{e=performance.now()},get elapsed(){return performance.now()-e}}},U=()=>{let e=0;return{reset:()=>{e=0},get peek(){return e},get elapsed(){return++e}}},Ce=(e,t)=>{if(typeof e!=`function`)throw Error(`Param 'fn' should be a function. Got: ${typeof e}`);let n=1;return{get elapsed(){return t.elapsed},get isDone(){return t.isDone},get runState(){return t.isDone?`idle`:`scheduled`},get startCount(){return n},get startCountTotal(){return n},compute:()=>{let n=t.elapsed;return e(n)},reset:()=>{t.reset(),n++}}},we=(e,t,n=`slow`)=>{let r=0,a,o=i(t,1e3);return()=>new Promise(async(s,c)=>{let l=performance.now()-r;if(a===void 0||l>o)try{r=performance.now(),a=await e(l),o=i(t,1e3)}catch(e){n===`fast`?(a=void 0,r=0):n===`backoff`&&(o=Math.floor(o*1.2)),c(e);return}s(a)})};var W=class{#e;#t;#n=!1;constructor(){let{promise:e,resolve:t}=O();this.#e=e,this.#t=t}get(){return this.#e}add(e){if(this.#n)throw Error(`QueueSingleUse has already been used`);this.#n=!0,this.#t(e)}get isUsed(){return this.#n}};const Te=()=>new W,Ee=(e,t,n)=>{let r,i=!1;return r=globalThis.setTimeout(()=>{r=void 0;try{t(`Timeout after ${e}ms`)}finally{n!==void 0&&n(i)}},e),e=>{r!==void 0&&(globalThis.clearTimeout(r),r=void 0),e?t(e):i=!0,n!==void 0&&n(i)}},G=e=>Object.freeze({value:e.value,visited:[...e.visited],machine:e.machine}),K=(e,t)=>{let[n,r]=De(e);if(!n)throw Error(r);let i=t??Object.keys(n.states)[0];if(n.states[i]===void 0)throw TypeError(`Initial state ('${i}') not found`);let a=ke(n.states);if(a===void 0)throw Error(`Could not normalise transitions`);return Object.freeze({value:i,visited:[],machine:Object.freeze(Object.fromEntries(a))})},q=e=>K(e.machine),De=e=>e===void 0?[void 0,`Parameter undefined`]:e===null?[void 0,`Parameter null`]:`states`in e?[e,``]:typeof e==`object`?[{states:e},``]:[void 0,`Unexpected type: ${typeof e}. Expected object`],J=e=>X(e).length===0,Y=e=>{Ae(e);let t=e.machine[e.value];return t.length===1&&t[0].state===null?[]:t},X=e=>Y(e).map(e=>e.state),Oe=e=>{let t=e=>{if(e===null)return{state:null};if(typeof e==`string`)return{state:e};if(typeof e==`object`&&`state`in e){let t=e.state;if(typeof t!=`string`)throw TypeError(`Target 'state' field is not a string. Got: ${typeof t}`);return`preconditions`in e?{state:t,preconditions:e.preconditions}:{state:t}}else throw Error(`Unexpected type: ${typeof e}. Expected string or object with 'state' field.`)};if(Array.isArray(e)){let n=!1,r=e.map(e=>{let r=t(e);if(!r)throw Error(`Invalid target`);return n||=r.state===null,r});if(n&&r.length>1)throw Error(`Cannot have null as an possible state`);return r}else{let n=t(e);return n?[n]:void 0}},ke=e=>{let t=new Map;for(let[n,r]of Object.entries(e)){if(n===void 0)throw TypeError(`Top-level undefined state`);if(r===void 0)throw TypeError(`Undefined target state for ${n}`);if(t.has(n))throw Error(`State defined twice: ${n}`);if(n.includes(` `))throw Error(`State names cannot contain spaces`);t.set(n,[])}for(let[n,r]of Object.entries(e)){let e=Oe(r);if(e===void 0)throw Error(`Could not normalise target`);if(e!==null){let r=new Set;for(let i of e){if(r.has(i.state))throw Error(`Target state '${i.state}' already exists for '${n}'`);if(r.add(i.state),i.state!==null&&!t.has(i.state))throw Error(`Target state '${i.state}' is not defined as a top-level state. Defined under: '${n}'`)}t.set(n,e)}}return t},Ae=e=>{if(e===void 0)throw TypeError(`Param 'state' is undefined`);if(typeof e.value!=`string`)throw TypeError(`Existing state is not a string`)},Z=(e,t)=>(Ae(e),$(e,t),Object.freeze({value:t,machine:e.machine,visited:ne([e.visited,[e.value]])})),je=e=>{let t=Y(e).at(0);if(!t||t.state===null)throw Error(`Not possible to move to a next state from '${e.value}`);return Z(e,t.state)},Q=(e,t)=>{try{return $(e,t),!0}catch{return!1}},$=(e,t)=>{if(t===null)throw Error(`Cannot transition to null state`);if(t===void 0)throw Error(`Cannot transition to undefined state`);if(typeof t!=`string`)throw TypeError(`Parameter 'toState' should be a string. Got: ${typeof t}`);let n=X(e);if(n.length===0)throw Error(`Machine is in terminal state`);if(!n.includes(t))throw Error(`Target state '${t}' not available at current state '${e.value}'. Possible states: ${n.join(`, `)}`)},Me=(...e)=>{let t={};if(!Array.isArray(e))throw Error(`Expected array of strings`);if(e.length<=2)throw Error(`Expects at least two states`);for(let n=0;n<e.length;n++){let r=e[n];if(typeof r!=`string`)throw TypeError(`Expected array of strings. Got type '${typeof r}' at index ${n.toString()}`);t[r]=n===e.length-1?null:e[n+1]}return t},Ne=(...e)=>{let t={};if(!Array.isArray(e))throw Error(`Expected array of strings`);if(e.length<2)throw Error(`Expects at least two states`);for(let[n,r]of e.entries()){if(typeof r!=`string`)throw TypeError(`Expected array of strings. Got type '${typeof r}' at index ${n.toString()}`);t[r]=[]}for(let n=0;n<e.length;n++){let r=t[e[n]];n===e.length-1?e.length>1?r.push(e[n-1]):t[e[n]]=null:(r.push(e[n+1]),n>0&&r.push(e[n-1]))}return t};async function Pe(e,t){let n=Array.isArray(t)?{handlers:t}:t,r=_(n.debug,{category:`StateMachineDriver`}),i=new Map;for(let e of n.handlers){let t=Array.isArray(e.if)?e.if:[e.if];for(let n of t){if(typeof n!=`string`)throw TypeError(`Expected single or array of strings for the 'if' field. Got: '${typeof n}'.`);if(i.has(n))throw Error(`Multiple handlers defined for state '${n}'. There should be at most one.`);i.set(n,e)}}let o={rank:(e,t)=>a(e.score??0,t.score??0),shuffle:n.shuffleHandlers??!1},s=K(e);for(let[e]of i)if(s.machine[e]===void 0&&e!==`__fallback`)throw Error(`StateMachineDriver handler references a state ('${e}') which is not defined on the machine. Therefore this handler will never run.'`);return{reset:()=>{s=q(s)},getValue:()=>s.value,run:async()=>{r(`Run. State: ${s.value}`);let e=s.value,t=i.get(e);if(t===void 0&&(r(` No handler for state '${e}', trying __fallback`),t=i.get(`__fallback`)),t===void 0){r(` No __fallback handler`);return}let n=t.resultChoice===`first`?{...o,stop:e=>e?`reset`in e||`next`in e&&e.next!==void 0:!1}:o,a=await w(t.then,n,s);r(` In state '${s.value}' results: ${a.length}. Choice: ${t.resultChoice}`);let c;switch(t.resultChoice??`highest`){case`highest`:c=a.at(-1);break;case`first`:c=a[0];break;case`lowest`:c=a.at(0);break;case`random`:c=te(a);break;default:throw Error(`Unknown 'resultChoice' option: ${t.resultChoice}. Expected highest, first, lowest or random`)}return r(` Chosen result: ${JSON.stringify(c)}`),c?.reset?s=q(s):c&&c.next&&(typeof c.next==`boolean`?s=je(s):(r(JSON.stringify(a)),s=Z(s,c.next))),s},to:e=>(s=Z(s,e),s)}}var Fe=class extends v{#e;#t;#n;#r=!1;#i=!1;#a=t();constructor(e,t={}){super(),this.#n=t.debug??!1,this.#e=K(e,t.initial),this.#t=G(this.#e)}#o(e){this.#i!==e&&(this.#i=e,e?(this.#r=!0,setTimeout(()=>{this.#r&&(this.#r=!1,this.fireEvent(`stop`,{state:this.#e.value}))},2)):this.#r=!1)}get statesPossible(){return X(this.#e)}get statesDefined(){return Object.keys(this.#e.machine)}next(){let e=X(this.#e);return e.length===0?null:(this.state=e[0],e[0])}get isDone(){return J(this.#e)}reset(){this.#o(!1),this.#e=G(this.#t),this.#a=r()}validateTransition(e){$(this.#e,e)}isValid(e){return Q(this.#e,e)}set state(e){let t=this.#e.value;e!==this.#e.value&&(this.#e=Z(this.#e,e),this.#n&&console.log(`StateMachine: ${t} -> ${e}`),this.#a=r(),setTimeout(()=>{this.fireEvent(`change`,{newState:e,priorState:t})},1),J(this.#e)&&this.#o(!0))}get state(){return this.#e.value}get changedAt(){return this.#a()}get elapsed(){return this.#a()}},Ie=e({StateMachineWithEvents:()=>Fe,cloneState:()=>G,driver:()=>Pe,fromList:()=>Me,fromListBidirectional:()=>Ne,init:()=>K,isDone:()=>J,isValidTransition:()=>Q,next:()=>je,normaliseTargets:()=>Oe,possible:()=>X,possibleTargets:()=>Y,reset:()=>q,to:()=>Z,validateMachine:()=>De,validateTransition:()=>$}),Le=e({DispatchList:()=>de,Pool:()=>D,PoolUser:()=>T,RequestResponseMatch:()=>N,Resource:()=>E,StateMachine:()=>Ie,SyncWait:()=>R,TaskQueueMutable:()=>_e,WaitForValue:()=>W,backoffGenerator:()=>P,continuously:()=>n,create:()=>ge,debounce:()=>ue,delay:()=>C,delayLoop:()=>le,elapsedMillisecondsAbsolute:()=>H,elapsedTicksAbsolute:()=>U,eventRace:()=>me,everyNth:()=>fe,frequencyTimer:()=>Se,hasElapsed:()=>ye,iterateBreadth:()=>b,iterateDepth:()=>x,movingAverageTimed:()=>he,ofTotal:()=>be,ofTotalTicks:()=>xe,promiseWithResolvers:()=>O,rateMinimum:()=>A,relative:()=>V,repeat:()=>j,repeatSync:()=>M,retryFunction:()=>F,retryTask:()=>I,run:()=>w,runOnce:()=>L,runSingle:()=>pe,singleItem:()=>Te,sleep:()=>s,throttle:()=>ve,timeout:()=>k,timerAlwaysDone:()=>z,timerNeverDone:()=>B,timerWithFunction:()=>Ce,updateOutdated:()=>we,waitFor:()=>Ee});export{A,pe as B,L as C,N as D,I as E,E as F,le as G,de as H,ge as I,b as K,he as L,O as M,D as N,j as O,T as P,me as R,R as S,F as T,ue as U,fe as V,C as W,z as _,Z as a,ve as b,Te as c,U as d,Se as f,V as g,xe as h,K as i,k as j,M as k,we as l,be as m,Ie as n,Ee as o,ye as p,x as q,Fe as r,W as s,Le as t,H as u,B as v,P as w,_e as x,Ce as y,w as z};