{"version":3,"sources":["../ts/modules/queuing.ts"],"names":["logError","err","require","console","error","exports","AsyncQueue","constructor","this","onEnqueue","Promise","resolve","onDequeue","onBeforeEach","onAfterEach","onResolve","onReject","onRetry","onEmpty","_queue","pending","observable_1","ObservableValue","enqueue","fn","retries","value","then","reject","run","val","let","queue"],"mappings":"8FAEA,SAASA,SAAUC,KAClBC,QAAS,CAAE,WAAa,UACvBC,QAAQC,MAAOH,GAAG,CACnB,CAAC,CACF,C,iFAEAI,QAAAC,iBAAAC,cAqEQC,KAAAC,UAA0C,IAAMC,QAAQC,QAAO,EAE/DH,KAAAI,UAA0C,IAAMF,QAAQC,QAAO,EAE/DH,KAAAK,aAA6C,IAAMH,QAAQC,QAAO,EAElEH,KAAAM,YAA4C,IAAMJ,QAAQC,QAAO,EAEjEH,KAAAO,UAAqD,IAAML,QAAQC,QAAO,EAE1EH,KAAAQ,SAAoD,IAAMN,QAAQC,QAAO,EAEzEH,KAAAS,QAAmD,IAAMP,QAAQC,QAAO,EAExEH,KAAAU,QAAsB,OAErBV,KAAAW,OAAST,QAAQC,QAAO,EAEzBH,KAAAY,QAAU,IAAIC,aAAAC,gBAAiB,CAAA,CAAK,CAC5C,CAvFQC,QAAYC,GAA4BC,QAAU,GAExD,OADAjB,KAAKY,QAAQM,MAAQ,CAAA,EACdhB,QAAQC,QAASH,KAAKC,UAAS,CAAE,EACtCkB,KAAM,KAAM3B,QAAQ,EACpB2B,KAAM,IAAM,IAAIjB,QAAY,CAAEC,QAASiB,UACvC,MAAMC,IAAM,IACJ,IAAInB,QAAY,CAAEC,QAASiB,UACjClB,QAAQC,QAASH,KAAKK,aAAY,CAAE,EAClCc,KAAM,KAAM3B,QAAQ,EACpB2B,KAAM,IAAMH,GAAE,CAAE,EAChBG,KACAG,MACCpB,QAAQC,QAASH,KAAKM,YAAW,CAAE,EAClCa,KAAM,KAAM3B,QAAQ,EACpB2B,KAAM,IAAMhB,QAASmB,GAAG,CAAE,CAC5B,EACA7B,MACCD,SAAUC,GAAG,EAEbS,QAAQC,QAASH,KAAKM,YAAW,CAAE,EAClCa,KAAM,KAAM3B,QAAQ,EACpB2B,KAAM,IAAMC,OAAQ3B,GAAG,CAAE,CAC3B,CAAC,CAEJ,CAAC,EAGF8B,IAAIC,MACHxB,KAAKW,OACJQ,KAAM,IAAMnB,KAAKI,UAAS,CAAE,EAC5Be,KAAM,KAAM3B,QAAQ,EACpB2B,KAAME,GAAG,EACX,KAAmB,EAAZJ,OAAO,IACbO,MAAQA,MAAML,KAAM,KAAM1B,KACzBS,QAAQC,QAASH,KAAKS,QAAShB,GAAG,CAAE,EACnC0B,KAAM,KAAM3B,QAAQ,EACpB2B,KAAME,GAAG,CAAE,EAIdG,MAAQA,MAAML,KACbG,MACCpB,QAAQC,QAASH,KAAKO,UAAWe,GAAG,CAAE,EACrCH,KAAM,KAAM3B,QAAQ,EACpB2B,KAAM,KACFnB,KAAKW,SAAWa,QACnBxB,KAAKY,QAAQM,MAAQ,CAAA,GAEtBf,QAASmB,GAAG,CACb,CAAC,CACF,EACA7B,MACCS,QAAQC,QAASH,KAAKQ,SAAUf,GAAG,CAAE,EACpC0B,KAAM,KAAM3B,QAAQ,EACpB2B,KAAM,KACFnB,KAAKW,SAAWa,QACnBxB,KAAKY,QAAQM,MAAQ,CAAA,GAEtBE,OAAQ3B,GAAG,CACZ,CAAC,CACF,CAAC,EAGFO,KAAKW,OAASa,KACf,CAAC,CAAE,CAEL,C","file":"queuing.js","sourcesContent":["import { ObservableValue } from 'observable';\r\n\r\nfunction logError( err ) {\r\n\trequire( [ 'console' ], ( console: typeof ConsoleWrapper ) => {\r\n\t\tconsole.error( err );\r\n\t} );\r\n}\r\n\r\nexport class AsyncQueue {\r\n\tpublic enqueue( fn: () => T|PromiseLike, retries = 0 ) {\r\n\t\tthis.pending.value = true;\r\n\t\treturn Promise.resolve( this.onEnqueue() )\r\n\t\t\t.then( null, logError )\r\n\t\t\t.then( () => new Promise( ( resolve, reject ) => {\r\n\t\t\t\tconst run = () => {\r\n\t\t\t\t\treturn new Promise( ( resolve, reject ) => {\r\n\t\t\t\t\t\tPromise.resolve( this.onBeforeEach() )\r\n\t\t\t\t\t\t\t.then( null, logError )\r\n\t\t\t\t\t\t\t.then( () => fn() )\r\n\t\t\t\t\t\t\t.then(\r\n\t\t\t\t\t\t\t\tval => {\r\n\t\t\t\t\t\t\t\t\tPromise.resolve( this.onAfterEach() )\r\n\t\t\t\t\t\t\t\t\t.then( null, logError )\r\n\t\t\t\t\t\t\t\t\t.then( () => resolve( val ) );\r\n\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\terr => {\r\n\t\t\t\t\t\t\t\t\tlogError( err );\r\n\r\n\t\t\t\t\t\t\t\t\tPromise.resolve( this.onAfterEach() )\r\n\t\t\t\t\t\t\t\t\t.then( null, logError )\r\n\t\t\t\t\t\t\t\t\t.then( () => reject( err ) );\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t);\r\n\t\t\t\t\t} );\r\n\t\t\t\t};\r\n\r\n\t\t\t\tlet queue: Promise =\r\n\t\t\t\t\tthis._queue\r\n\t\t\t\t\t.then( () => this.onDequeue() )\r\n\t\t\t\t\t.then( null, logError )\r\n\t\t\t\t\t.then( run );\r\n\t\t\t\twhile( retries-- > 0 ) {\r\n\t\t\t\t\tqueue = queue.then( null, err =>\r\n\t\t\t\t\t\tPromise.resolve( this.onRetry( err ) )\r\n\t\t\t\t\t\t.then( null, logError )\r\n\t\t\t\t\t\t.then( run )\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tqueue = queue.then(\r\n\t\t\t\t\tval => {\r\n\t\t\t\t\t\tPromise.resolve( this.onResolve( val ) )\r\n\t\t\t\t\t\t.then( null, logError )\r\n\t\t\t\t\t\t.then( () => {\r\n\t\t\t\t\t\t\tif( this._queue === queue ) {\r\n\t\t\t\t\t\t\t\tthis.pending.value = false;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tresolve( val );\r\n\t\t\t\t\t\t} );\r\n\t\t\t\t\t},\r\n\t\t\t\t\terr => {\r\n\t\t\t\t\t\tPromise.resolve( this.onReject( err ) )\r\n\t\t\t\t\t\t.then( null, logError )\r\n\t\t\t\t\t\t.then( () => {\r\n\t\t\t\t\t\t\tif( this._queue === queue ) {\r\n\t\t\t\t\t\t\t\tthis.pending.value = false;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\treject( err );\r\n\t\t\t\t\t\t} );\r\n\t\t\t\t\t}\r\n\t\t\t\t);\r\n\r\n\t\t\t\tthis._queue = queue;\r\n\t\t\t} )\r\n\t\t);\r\n\t}\r\n\r\n\tpublic onEnqueue: () => void|PromiseLike = () => Promise.resolve();\r\n\r\n\tpublic onDequeue: () => void|PromiseLike = () => Promise.resolve();\r\n\r\n\tpublic onBeforeEach: () => void|PromiseLike = () => Promise.resolve();\r\n\r\n\tpublic onAfterEach: () => void|PromiseLike = () => Promise.resolve();\r\n\r\n\tpublic onResolve: ( val?: any ) => void|PromiseLike = () => Promise.resolve();\r\n\r\n\tpublic onReject: ( err?: any ) => void|PromiseLike = () => Promise.resolve();\r\n\r\n\tpublic onRetry: ( err?: any ) => void|PromiseLike = () => Promise.resolve();\r\n\r\n\tpublic onEmpty: () => void = () => {};\r\n\r\n\tprivate _queue = Promise.resolve();\r\n\r\n\tpublic pending = new ObservableValue( false );\r\n}\r\n"]}