{"version":3,"sources":["../src/async/asyncSignal.ts"],"names":["AsyncSignalAbort","AsyncSignalId","asyncSignal","constraint","options","isResolved","isRejected","isPending","resolveSignal","rejectSignal","timeoutId","objPromise","signalId","reset","resolve","reject","signal","timeout","returns","result","e","__signals","AsyncSignalManager","__privateAdd","__privateGet","id","ids","args"],"mappings":"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","file":"chunk-ASFXUTIN.mjs","sourcesContent":["/**\n *  生成一个异步控制信号\n *\n *  当满足condition时会进行等待\n *\n *  定义一个异步等待信号\n *  let signal = asyncSignal()\n *\n *  //\n *  然后在需要等待的地方\n *  await signal()\n *  await signal(100)  代表信号会自动超时resolve\n *  await signal(100,new Error())  代表信号会自动超时reject\n *\n *  可以手动resolve或reject该signal\n *  当要结束等待时调用 signal.resolve()\n *  当等待出错时调用 signal.reject()\n *\n * 可以传入一个condition函数，当signal.resolve时，会同时进行调用，该函数必须返回true，否则会继承等待\n * 超时时不会调用\n * let signal = asyncSignal(()=>{})\n *\n *  当signal使用一次后，如果需要再次使用，则需要signal.reset()复位一下，然后就可以\n *   await signal()\n *\n *  @param {Function} constraint 约束函数，指定当resolve或reject时，需要同时满足这个约束函数返回true才会进行resolve或reject\n *\n */ \n\n \n export class AsyncSignalAbort extends Error {}\n \n export interface IAsyncSignal {\n    (timeout?:number,returns?:any):Awaited<Promise<any>>\n    id:number\n    reset(): void\n    reject(e?:Error | string):void\n    resolve(result?: any):void\n    destroy():void\n    isResolved():boolean\n    isRejected():boolean\n    isPending():boolean\n }\n\n\nlet AsyncSignalId = 0\n\n/**\n * 生成一个异步信号\n * \n * const signal = asyncSignal()\n * const signal = asyncSignal(()=>x==1,{timeout:10})\n * \n * await  signal(timeout)\n * signal.resolve()\n * signal.reject()\n * signal.destroy()\n *\n * @param {function} constraint\n *      当调用signal.resolve()时，还需要满足额外的约束条件，仅当constraint返回true，则signal才可以进行真正resolve\n * @returns {function}\n */\n\nexport function asyncSignal(constraint?:Function,options:{timeout:number}={timeout:0}) : IAsyncSignal {     \n     let isResolved:boolean = false,isRejected:boolean = false,isPending:boolean = false\n     let resolveSignal:Function, rejectSignal:Function, timeoutId:any = 0\n     let objPromise:Promise<any> | null\n     let signalId = ++AsyncSignalId\n\n     // 重置信号，可以再次复用\n     const reset = function () {\n         clearTimeout(timeoutId)\n         isResolved = false\n         isRejected = false\n         isPending = false\n         objPromise = new Promise((resolve, reject) => {\n             resolveSignal = resolve\n             rejectSignal = reject\n         })\n     }\n     \n     reset()\n\n    async function signal(timeout:number =0 , returns?:any){\n         // 如果constraint返回的true，代表不需要等待\n         if (typeof (constraint) === \"function\" && constraint()) {\n             isResolved = true\n             return\n         }\n\n         // 如果信号上次已经完成了，则需要重置信号\n         if (isResolved || isRejected) reset()\n \n         // 指定超时功能\n         if (timeout > 0) {\n             timeoutId = setTimeout(() => {\n                 isResolved = true\n                 try {\n                     if (returns instanceof Error) {\n                         rejectSignal(returns)\n                     } else {\n                         resolveSignal(returns)\n                     }\n                 } catch {\n                 }\n             }, timeout)\n         }\n         isPending = true\n         return objPromise\n     }\n     signal.id = signalId\n     signal.resolve = (result?:any) => {        \n         clearTimeout(timeoutId)\n         if(!isPending) return \n         if (isResolved || isRejected) return\n         // 注意：是否真正resolve还受约束条件的约束，只有满足约束条件时才会真正resolve\n         if (typeof (constraint) === \"function\" && constraint()) {\n             if(constraint()){\n                 resolveSignal(result)\n             }else{\n                // 如果不满足约束条件，则静默返回，可以通过signal.isFulfilled()来判断是否完成\n                return    \n             }\n         } else {\n             resolveSignal(result)\n         }\n         isResolved = true\n     } \n\n     signal.reject = (e?:Error | string) => {        \n         clearTimeout(timeoutId)\n         if(!isPending) return \n         if (isResolved || isRejected) return\n         rejectSignal(typeof(e)==='string' ? new Error(e) : ((e instanceof Error) ? e : new Error()))\n         isRejected = true\n     }\n \n     // 信号被销毁时，产生一个中止错误，信号的使用者可以据此进行善后处理\n     signal.destroy = () => {\n        clearTimeout(timeoutId)\n        if(isPending) rejectSignal(new AsyncSignalAbort())   \n        isResolved =false\n        isPending = false         \n        isRejected =false\n        objPromise = null\n     }\n\n     signal.reset = reset\n     signal.isResolved = () => isResolved\n     signal.isRejected = () => isRejected \n     signal.isPending = () => isPending \n     return signal as unknown as IAsyncSignal\n }\n \n /**\n  *   管理多个异步信号，并确保能正确resolve和reject\n  *\n  *\n  *\n  *  let signals = new AsyncSignalManager({\n  *      timeout:60 * 1000,               // 所有信号均在1分钟后自动超时，0代表不设超时，并且此值应该大于signal(timeout)时指定的超时值\n  *  })\n  *\n  *  signal = signals.create() 创建一个asyncSignal\n  *\n  *  signals.destroy()   销毁所有异步信号\n  *  signal.resolve()    resolve所有异步信号\n  *  signal.reject()     reject所有异步信号\n  *  signal.reset()      reset所有异步信号\n  *\n  *\n  */\n  \n\n export class AsyncSignalManager {\n    #_signals:Record<string,IAsyncSignal> = {}\n    constructor(public options?:{timeout: number} ) {\n         this.options = Object.assign({\n             timeout:0,// 为所有异步信号提供一个默认的超时时间，当信号超时未resolve时，会自动进行reject(timeout)\n         },options)\n     }\n     get signals():Record<string,IAsyncSignal> {return this.#_signals} \n \n     /**\n      * 创建新的异步信号\n      * @param constraint         额外的约束条件\n      * @param id\n      */\n     create(constraint?:Function){\n         let signal = asyncSignal(constraint,this.options)\n         this.#_signals[signal.id] = signal\n         return signal\n     }\n \n     /**\n      * 销毁指定的或者所有异步信号\n      *\n      *  destroy(id)\n      *  destroy([id,id,...])\n      *  destroy()                   // 销毁所有\n      * @param {string} id           可选的信号id,如果未指定则删除所有的信号\n      *\n      */ \n      \n    destroy(id:number | number[] | undefined) {\n         let ids = Array.isArray(id) ? id : (id===undefined ? Object.keys(this.#_signals) : [id])\n         for(let id of ids){\n             if(id in this.#_signals){\n                 try{\n                     this.#_signals[id].destroy()\n                     delete this.#_signals[id]\n                 }catch (e) { }\n             }\n         }\n    }\n    resolve(){\n         let args = arguments\n         Object.values(this.#_signals).forEach(signal=>signal.resolve(args))\n    }\n    reject(e:Error | string){\n         Object.values(this.#_signals).forEach(signal=>signal.reject(e))\n    }\n    reset(){\n         Object.values(this.#_signals).forEach(signal=>signal.reset())\n    }\n } \n\n "]}