@@ -8,3 +8,3 @@ export type DeferCallback = (error?: Error) => void; | ||
| private _callAwait; | ||
| private _drainQueue; | ||
| private _flush; | ||
| private _callDefer; | ||
@@ -11,0 +11,0 @@ defer(defer: DeferFunction): void; |
@@ -8,3 +8,3 @@ export type DeferCallback = (error?: Error) => void; | ||
| private _callAwait; | ||
| private _drainQueue; | ||
| private _flush; | ||
| private _callDefer; | ||
@@ -11,0 +11,0 @@ defer(defer: DeferFunction): void; |
+9
-24
@@ -22,10 +22,2 @@ "use strict"; | ||
| } | ||
| // Threshold for synchronous callbacks before yielding to event loop | ||
| // This prevents stack overflow while minimizing async overhead | ||
| var SYNC_DEPTH_THRESHOLD = 1000; | ||
| // Cross-platform async scheduler (Node 0.8+ compatible) | ||
| // setImmediate is preferred (Node 0.10+), falls back to setTimeout for Node 0.8 | ||
| var scheduleAsync = typeof setImmediate === 'function' ? setImmediate : function(fn) { | ||
| return setTimeout(fn, 0); | ||
| }; | ||
| var Queue = /*#__PURE__*/ function() { | ||
@@ -43,7 +35,6 @@ "use strict"; | ||
| awaitCalled: false, | ||
| syncDepth: 0 | ||
| flushing: false | ||
| }; | ||
| this._callAwait = this._callAwait.bind(this); | ||
| this._callDefer = this._callDefer.bind(this); | ||
| this._drainQueue = this._drainQueue.bind(this); | ||
| } | ||
@@ -56,6 +47,4 @@ var _proto = Queue.prototype; | ||
| }; | ||
| _proto._drainQueue = function _drainQueue() { | ||
| // Reset sync depth when we enter from async context | ||
| this._state.syncDepth = 0; | ||
| // Process all available tasks up to parallelism limit | ||
| _proto._flush = function _flush() { | ||
| this._state.flushing = true; | ||
| while(!this._state.error && this._state.tasks.length && this._state.runningCount < this._state.parallelism){ | ||
@@ -65,2 +54,6 @@ this._state.runningCount++; | ||
| } | ||
| this._state.flushing = false; | ||
| if (this._state.error || !(this._state.tasks.length + this._state.runningCount)) { | ||
| this._callAwait(); | ||
| } | ||
| }; | ||
@@ -70,12 +63,4 @@ _proto._callDefer = function _callDefer(err) { | ||
| if (err && !this._state.error) this._state.error = err; | ||
| if (this._state.error || !(this._state.tasks.length + this._state.runningCount)) return this._callAwait(); | ||
| if (!this._state.tasks.length) return; | ||
| // Trampoline: yield to event loop periodically to prevent stack overflow | ||
| this._state.syncDepth++; | ||
| if (this._state.syncDepth >= SYNC_DEPTH_THRESHOLD) { | ||
| scheduleAsync(this._drainQueue); | ||
| return; | ||
| } | ||
| this._state.runningCount++; | ||
| this._state.tasks.shift()(this._callDefer); | ||
| if (this._state.flushing) return; | ||
| this._flush(); | ||
| }; | ||
@@ -82,0 +67,0 @@ _proto.defer = function defer(defer) { |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"sources":["/Users/kevin/Dev/OpenSource/utils/queue-cb/src/index.ts"],"sourcesContent":["import LinkedArray from './LinkedArray.ts';\n\nexport type DeferCallback = (error?: Error) => void;\nexport type DeferFunction = (calback: DeferCallback) => void;\nexport type AwaitCallback = (error?: Error) => void;\n\n// Threshold for synchronous callbacks before yielding to event loop\n// This prevents stack overflow while minimizing async overhead\nconst SYNC_DEPTH_THRESHOLD = 1000;\n\n// Cross-platform async scheduler (Node 0.8+ compatible)\n// setImmediate is preferred (Node 0.10+), falls back to setTimeout for Node 0.8\nconst scheduleAsync = typeof setImmediate === 'function' ? setImmediate : (fn: () => void) => setTimeout(fn, 0);\n\ninterface QueueState {\n parallelism: number;\n tasks: LinkedArray<DeferFunction>;\n runningCount: number;\n error: Error | null;\n awaitCalled: boolean;\n awaitCallback: AwaitCallback | null;\n syncDepth: number;\n}\n\nexport default class Queue {\n private _state: QueueState;\n\n constructor(parallelism: number = Infinity) {\n this._state = {\n parallelism,\n tasks: new LinkedArray(),\n runningCount: 0,\n error: null,\n awaitCallback: null,\n awaitCalled: false,\n syncDepth: 0,\n };\n this._callAwait = this._callAwait.bind(this);\n this._callDefer = this._callDefer.bind(this);\n this._drainQueue = this._drainQueue.bind(this);\n }\n\n private _callAwait() {\n if (this._state.awaitCalled || !this._state.awaitCallback) return;\n this._state.awaitCalled = true;\n return this._state.awaitCallback(this._state.error);\n }\n\n private _drainQueue() {\n // Reset sync depth when we enter from async context\n this._state.syncDepth = 0;\n // Process all available tasks up to parallelism limit\n while (!this._state.error && this._state.tasks.length && this._state.runningCount < this._state.parallelism) {\n this._state.runningCount++;\n this._state.tasks.shift()(this._callDefer);\n }\n }\n\n private _callDefer(err?: Error) {\n this._state.runningCount--;\n if (err && !this._state.error) this._state.error = err;\n if (this._state.error || !(this._state.tasks.length + this._state.runningCount)) return this._callAwait();\n if (!this._state.tasks.length) return;\n\n // Trampoline: yield to event loop periodically to prevent stack overflow\n this._state.syncDepth++;\n if (this._state.syncDepth >= SYNC_DEPTH_THRESHOLD) {\n scheduleAsync(this._drainQueue);\n return;\n }\n\n this._state.runningCount++;\n this._state.tasks.shift()(this._callDefer);\n }\n\n defer(defer: DeferFunction) {\n if (this._state.error) return;\n if (this._state.runningCount < this._state.parallelism) {\n this._state.runningCount++;\n defer(this._callDefer);\n } else this._state.tasks.push(defer);\n }\n\n await(callback: AwaitCallback) {\n if (this._state.awaitCallback) throw new Error(`Awaiting callback was added twice: ${callback}`);\n this._state.awaitCallback = callback;\n if (this._state.error || !(this._state.tasks.length + this._state.runningCount)) return this._callAwait();\n }\n}\n"],"names":["Queue","SYNC_DEPTH_THRESHOLD","scheduleAsync","setImmediate","fn","setTimeout","parallelism","Infinity","_state","tasks","LinkedArray","runningCount","error","awaitCallback","awaitCalled","syncDepth","_callAwait","bind","_callDefer","_drainQueue","length","shift","err","defer","push","await","callback","Error"],"mappings":"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"} | ||
| {"version":3,"sources":["/Users/kevin/Dev/OpenSource/utils/queue-cb/src/index.ts"],"sourcesContent":["import LinkedArray from './LinkedArray.ts';\n\nexport type DeferCallback = (error?: Error) => void;\nexport type DeferFunction = (calback: DeferCallback) => void;\nexport type AwaitCallback = (error?: Error) => void;\n\ninterface QueueState {\n parallelism: number;\n tasks: LinkedArray<DeferFunction>;\n runningCount: number;\n error: Error | null;\n awaitCalled: boolean;\n awaitCallback: AwaitCallback | null;\n flushing: boolean;\n}\n\nexport default class Queue {\n private _state: QueueState;\n\n constructor(parallelism: number = Infinity) {\n this._state = {\n parallelism,\n tasks: new LinkedArray(),\n runningCount: 0,\n error: null,\n awaitCallback: null,\n awaitCalled: false,\n flushing: false,\n };\n this._callAwait = this._callAwait.bind(this);\n this._callDefer = this._callDefer.bind(this);\n }\n\n private _callAwait() {\n if (this._state.awaitCalled || !this._state.awaitCallback) return;\n this._state.awaitCalled = true;\n return this._state.awaitCallback(this._state.error);\n }\n\n private _flush() {\n this._state.flushing = true;\n while (!this._state.error && this._state.tasks.length && this._state.runningCount < this._state.parallelism) {\n this._state.runningCount++;\n this._state.tasks.shift()(this._callDefer);\n }\n this._state.flushing = false;\n if (this._state.error || !(this._state.tasks.length + this._state.runningCount)) {\n this._callAwait();\n }\n }\n\n private _callDefer(err?: Error) {\n this._state.runningCount--;\n if (err && !this._state.error) this._state.error = err;\n if (this._state.flushing) return;\n this._flush();\n }\n\n defer(defer: DeferFunction) {\n if (this._state.error) return;\n if (this._state.runningCount < this._state.parallelism) {\n this._state.runningCount++;\n defer(this._callDefer);\n } else this._state.tasks.push(defer);\n }\n\n await(callback: AwaitCallback) {\n if (this._state.awaitCallback) throw new Error(`Awaiting callback was added twice: ${callback}`);\n this._state.awaitCallback = callback;\n if (this._state.error || !(this._state.tasks.length + this._state.runningCount)) return this._callAwait();\n }\n}\n"],"names":["Queue","parallelism","Infinity","_state","tasks","LinkedArray","runningCount","error","awaitCallback","awaitCalled","flushing","_callAwait","bind","_callDefer","_flush","length","shift","err","defer","push","await","callback","Error"],"mappings":";;;;;;;eAgBqBA;;;oEAhBG;;;;;;;;;;;AAgBT,IAAA,AAAMA,sBAAN;;aAAMA;YAGPC,cAAAA,iEAAsBC;gCAHfF;QAIjB,IAAI,CAACG,MAAM,GAAG;YACZF,aAAAA;YACAG,OAAO,IAAIC,sBAAW;YACtBC,cAAc;YACdC,OAAO;YACPC,eAAe;YACfC,aAAa;YACbC,UAAU;QACZ;QACA,IAAI,CAACC,UAAU,GAAG,IAAI,CAACA,UAAU,CAACC,IAAI,CAAC,IAAI;QAC3C,IAAI,CAACC,UAAU,GAAG,IAAI,CAACA,UAAU,CAACD,IAAI,CAAC,IAAI;;iBAd1BZ;IAiBnB,OAAQW,UAIP,GAJD,SAAQA;QACN,IAAI,IAAI,CAACR,MAAM,CAACM,WAAW,IAAI,CAAC,IAAI,CAACN,MAAM,CAACK,aAAa,EAAE;QAC3D,IAAI,CAACL,MAAM,CAACM,WAAW,GAAG;QAC1B,OAAO,IAAI,CAACN,MAAM,CAACK,aAAa,CAAC,IAAI,CAACL,MAAM,CAACI,KAAK;IACpD;IAEA,OAAQO,MAUP,GAVD,SAAQA;QACN,IAAI,CAACX,MAAM,CAACO,QAAQ,GAAG;QACvB,MAAO,CAAC,IAAI,CAACP,MAAM,CAACI,KAAK,IAAI,IAAI,CAACJ,MAAM,CAACC,KAAK,CAACW,MAAM,IAAI,IAAI,CAACZ,MAAM,CAACG,YAAY,GAAG,IAAI,CAACH,MAAM,CAACF,WAAW,CAAE;YAC3G,IAAI,CAACE,MAAM,CAACG,YAAY;YACxB,IAAI,CAACH,MAAM,CAACC,KAAK,CAACY,KAAK,GAAG,IAAI,CAACH,UAAU;QAC3C;QACA,IAAI,CAACV,MAAM,CAACO,QAAQ,GAAG;QACvB,IAAI,IAAI,CAACP,MAAM,CAACI,KAAK,IAAI,CAAE,CAAA,IAAI,CAACJ,MAAM,CAACC,KAAK,CAACW,MAAM,GAAG,IAAI,CAACZ,MAAM,CAACG,YAAY,AAAD,GAAI;YAC/E,IAAI,CAACK,UAAU;QACjB;IACF;IAEA,OAAQE,UAKP,GALD,SAAQA,WAAWI,GAAW;QAC5B,IAAI,CAACd,MAAM,CAACG,YAAY;QACxB,IAAIW,OAAO,CAAC,IAAI,CAACd,MAAM,CAACI,KAAK,EAAE,IAAI,CAACJ,MAAM,CAACI,KAAK,GAAGU;QACnD,IAAI,IAAI,CAACd,MAAM,CAACO,QAAQ,EAAE;QAC1B,IAAI,CAACI,MAAM;IACb;IAEAI,OAAAA,KAMC,GANDA,SAAAA,MAAMA,KAAoB;QACxB,IAAI,IAAI,CAACf,MAAM,CAACI,KAAK,EAAE;QACvB,IAAI,IAAI,CAACJ,MAAM,CAACG,YAAY,GAAG,IAAI,CAACH,MAAM,CAACF,WAAW,EAAE;YACtD,IAAI,CAACE,MAAM,CAACG,YAAY;YACxBY,MAAM,IAAI,CAACL,UAAU;QACvB,OAAO,IAAI,CAACV,MAAM,CAACC,KAAK,CAACe,IAAI,CAACD;IAChC;IAEAE,OAAAA,KAIC,GAJDA,SAAAA,OAAMC,QAAuB;QAC3B,IAAI,IAAI,CAAClB,MAAM,CAACK,aAAa,EAAE,MAAM,IAAIc,MAAM,AAAC,sCAA8C,OAATD;QACrF,IAAI,CAAClB,MAAM,CAACK,aAAa,GAAGa;QAC5B,IAAI,IAAI,CAAClB,MAAM,CAACI,KAAK,IAAI,CAAE,CAAA,IAAI,CAACJ,MAAM,CAACC,KAAK,CAACW,MAAM,GAAG,IAAI,CAACZ,MAAM,CAACG,YAAY,AAAD,GAAI,OAAO,IAAI,CAACK,UAAU;IACzG;WAtDmBX"} |
@@ -8,3 +8,3 @@ export type DeferCallback = (error?: Error) => void; | ||
| private _callAwait; | ||
| private _drainQueue; | ||
| private _flush; | ||
| private _callDefer; | ||
@@ -11,0 +11,0 @@ defer(defer: DeferFunction): void; |
+9
-22
| import LinkedArray from './LinkedArray.js'; | ||
| // Threshold for synchronous callbacks before yielding to event loop | ||
| // This prevents stack overflow while minimizing async overhead | ||
| const SYNC_DEPTH_THRESHOLD = 1000; | ||
| // Cross-platform async scheduler (Node 0.8+ compatible) | ||
| // setImmediate is preferred (Node 0.10+), falls back to setTimeout for Node 0.8 | ||
| const scheduleAsync = typeof setImmediate === 'function' ? setImmediate : (fn)=>setTimeout(fn, 0); | ||
| let Queue = class Queue { | ||
@@ -14,6 +8,4 @@ _callAwait() { | ||
| } | ||
| _drainQueue() { | ||
| // Reset sync depth when we enter from async context | ||
| this._state.syncDepth = 0; | ||
| // Process all available tasks up to parallelism limit | ||
| _flush() { | ||
| this._state.flushing = true; | ||
| while(!this._state.error && this._state.tasks.length && this._state.runningCount < this._state.parallelism){ | ||
@@ -23,2 +15,6 @@ this._state.runningCount++; | ||
| } | ||
| this._state.flushing = false; | ||
| if (this._state.error || !(this._state.tasks.length + this._state.runningCount)) { | ||
| this._callAwait(); | ||
| } | ||
| } | ||
@@ -28,12 +24,4 @@ _callDefer(err) { | ||
| if (err && !this._state.error) this._state.error = err; | ||
| if (this._state.error || !(this._state.tasks.length + this._state.runningCount)) return this._callAwait(); | ||
| if (!this._state.tasks.length) return; | ||
| // Trampoline: yield to event loop periodically to prevent stack overflow | ||
| this._state.syncDepth++; | ||
| if (this._state.syncDepth >= SYNC_DEPTH_THRESHOLD) { | ||
| scheduleAsync(this._drainQueue); | ||
| return; | ||
| } | ||
| this._state.runningCount++; | ||
| this._state.tasks.shift()(this._callDefer); | ||
| if (this._state.flushing) return; | ||
| this._flush(); | ||
| } | ||
@@ -60,9 +48,8 @@ defer(defer) { | ||
| awaitCalled: false, | ||
| syncDepth: 0 | ||
| flushing: false | ||
| }; | ||
| this._callAwait = this._callAwait.bind(this); | ||
| this._callDefer = this._callDefer.bind(this); | ||
| this._drainQueue = this._drainQueue.bind(this); | ||
| } | ||
| }; | ||
| export { Queue as default }; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"sources":["/Users/kevin/Dev/OpenSource/utils/queue-cb/src/index.ts"],"sourcesContent":["import LinkedArray from './LinkedArray.ts';\n\nexport type DeferCallback = (error?: Error) => void;\nexport type DeferFunction = (calback: DeferCallback) => void;\nexport type AwaitCallback = (error?: Error) => void;\n\n// Threshold for synchronous callbacks before yielding to event loop\n// This prevents stack overflow while minimizing async overhead\nconst SYNC_DEPTH_THRESHOLD = 1000;\n\n// Cross-platform async scheduler (Node 0.8+ compatible)\n// setImmediate is preferred (Node 0.10+), falls back to setTimeout for Node 0.8\nconst scheduleAsync = typeof setImmediate === 'function' ? setImmediate : (fn: () => void) => setTimeout(fn, 0);\n\ninterface QueueState {\n parallelism: number;\n tasks: LinkedArray<DeferFunction>;\n runningCount: number;\n error: Error | null;\n awaitCalled: boolean;\n awaitCallback: AwaitCallback | null;\n syncDepth: number;\n}\n\nexport default class Queue {\n private _state: QueueState;\n\n constructor(parallelism: number = Infinity) {\n this._state = {\n parallelism,\n tasks: new LinkedArray(),\n runningCount: 0,\n error: null,\n awaitCallback: null,\n awaitCalled: false,\n syncDepth: 0,\n };\n this._callAwait = this._callAwait.bind(this);\n this._callDefer = this._callDefer.bind(this);\n this._drainQueue = this._drainQueue.bind(this);\n }\n\n private _callAwait() {\n if (this._state.awaitCalled || !this._state.awaitCallback) return;\n this._state.awaitCalled = true;\n return this._state.awaitCallback(this._state.error);\n }\n\n private _drainQueue() {\n // Reset sync depth when we enter from async context\n this._state.syncDepth = 0;\n // Process all available tasks up to parallelism limit\n while (!this._state.error && this._state.tasks.length && this._state.runningCount < this._state.parallelism) {\n this._state.runningCount++;\n this._state.tasks.shift()(this._callDefer);\n }\n }\n\n private _callDefer(err?: Error) {\n this._state.runningCount--;\n if (err && !this._state.error) this._state.error = err;\n if (this._state.error || !(this._state.tasks.length + this._state.runningCount)) return this._callAwait();\n if (!this._state.tasks.length) return;\n\n // Trampoline: yield to event loop periodically to prevent stack overflow\n this._state.syncDepth++;\n if (this._state.syncDepth >= SYNC_DEPTH_THRESHOLD) {\n scheduleAsync(this._drainQueue);\n return;\n }\n\n this._state.runningCount++;\n this._state.tasks.shift()(this._callDefer);\n }\n\n defer(defer: DeferFunction) {\n if (this._state.error) return;\n if (this._state.runningCount < this._state.parallelism) {\n this._state.runningCount++;\n defer(this._callDefer);\n } else this._state.tasks.push(defer);\n }\n\n await(callback: AwaitCallback) {\n if (this._state.awaitCallback) throw new Error(`Awaiting callback was added twice: ${callback}`);\n this._state.awaitCallback = callback;\n if (this._state.error || !(this._state.tasks.length + this._state.runningCount)) return this._callAwait();\n }\n}\n"],"names":["LinkedArray","SYNC_DEPTH_THRESHOLD","scheduleAsync","setImmediate","fn","setTimeout","Queue","_callAwait","_state","awaitCalled","awaitCallback","error","_drainQueue","syncDepth","tasks","length","runningCount","parallelism","shift","_callDefer","err","defer","push","await","callback","Error","Infinity","bind"],"mappings":"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"} | ||
| {"version":3,"sources":["/Users/kevin/Dev/OpenSource/utils/queue-cb/src/index.ts"],"sourcesContent":["import LinkedArray from './LinkedArray.ts';\n\nexport type DeferCallback = (error?: Error) => void;\nexport type DeferFunction = (calback: DeferCallback) => void;\nexport type AwaitCallback = (error?: Error) => void;\n\ninterface QueueState {\n parallelism: number;\n tasks: LinkedArray<DeferFunction>;\n runningCount: number;\n error: Error | null;\n awaitCalled: boolean;\n awaitCallback: AwaitCallback | null;\n flushing: boolean;\n}\n\nexport default class Queue {\n private _state: QueueState;\n\n constructor(parallelism: number = Infinity) {\n this._state = {\n parallelism,\n tasks: new LinkedArray(),\n runningCount: 0,\n error: null,\n awaitCallback: null,\n awaitCalled: false,\n flushing: false,\n };\n this._callAwait = this._callAwait.bind(this);\n this._callDefer = this._callDefer.bind(this);\n }\n\n private _callAwait() {\n if (this._state.awaitCalled || !this._state.awaitCallback) return;\n this._state.awaitCalled = true;\n return this._state.awaitCallback(this._state.error);\n }\n\n private _flush() {\n this._state.flushing = true;\n while (!this._state.error && this._state.tasks.length && this._state.runningCount < this._state.parallelism) {\n this._state.runningCount++;\n this._state.tasks.shift()(this._callDefer);\n }\n this._state.flushing = false;\n if (this._state.error || !(this._state.tasks.length + this._state.runningCount)) {\n this._callAwait();\n }\n }\n\n private _callDefer(err?: Error) {\n this._state.runningCount--;\n if (err && !this._state.error) this._state.error = err;\n if (this._state.flushing) return;\n this._flush();\n }\n\n defer(defer: DeferFunction) {\n if (this._state.error) return;\n if (this._state.runningCount < this._state.parallelism) {\n this._state.runningCount++;\n defer(this._callDefer);\n } else this._state.tasks.push(defer);\n }\n\n await(callback: AwaitCallback) {\n if (this._state.awaitCallback) throw new Error(`Awaiting callback was added twice: ${callback}`);\n this._state.awaitCallback = callback;\n if (this._state.error || !(this._state.tasks.length + this._state.runningCount)) return this._callAwait();\n }\n}\n"],"names":["LinkedArray","Queue","_callAwait","_state","awaitCalled","awaitCallback","error","_flush","flushing","tasks","length","runningCount","parallelism","shift","_callDefer","err","defer","push","await","callback","Error","Infinity","bind"],"mappings":"AAAA,OAAOA,iBAAiB,mBAAmB;AAgB5B,IAAA,AAAMC,QAAN,MAAMA;IAiBXC,aAAa;QACnB,IAAI,IAAI,CAACC,MAAM,CAACC,WAAW,IAAI,CAAC,IAAI,CAACD,MAAM,CAACE,aAAa,EAAE;QAC3D,IAAI,CAACF,MAAM,CAACC,WAAW,GAAG;QAC1B,OAAO,IAAI,CAACD,MAAM,CAACE,aAAa,CAAC,IAAI,CAACF,MAAM,CAACG,KAAK;IACpD;IAEQC,SAAS;QACf,IAAI,CAACJ,MAAM,CAACK,QAAQ,GAAG;QACvB,MAAO,CAAC,IAAI,CAACL,MAAM,CAACG,KAAK,IAAI,IAAI,CAACH,MAAM,CAACM,KAAK,CAACC,MAAM,IAAI,IAAI,CAACP,MAAM,CAACQ,YAAY,GAAG,IAAI,CAACR,MAAM,CAACS,WAAW,CAAE;YAC3G,IAAI,CAACT,MAAM,CAACQ,YAAY;YACxB,IAAI,CAACR,MAAM,CAACM,KAAK,CAACI,KAAK,GAAG,IAAI,CAACC,UAAU;QAC3C;QACA,IAAI,CAACX,MAAM,CAACK,QAAQ,GAAG;QACvB,IAAI,IAAI,CAACL,MAAM,CAACG,KAAK,IAAI,CAAE,CAAA,IAAI,CAACH,MAAM,CAACM,KAAK,CAACC,MAAM,GAAG,IAAI,CAACP,MAAM,CAACQ,YAAY,AAAD,GAAI;YAC/E,IAAI,CAACT,UAAU;QACjB;IACF;IAEQY,WAAWC,GAAW,EAAE;QAC9B,IAAI,CAACZ,MAAM,CAACQ,YAAY;QACxB,IAAII,OAAO,CAAC,IAAI,CAACZ,MAAM,CAACG,KAAK,EAAE,IAAI,CAACH,MAAM,CAACG,KAAK,GAAGS;QACnD,IAAI,IAAI,CAACZ,MAAM,CAACK,QAAQ,EAAE;QAC1B,IAAI,CAACD,MAAM;IACb;IAEAS,MAAMA,KAAoB,EAAE;QAC1B,IAAI,IAAI,CAACb,MAAM,CAACG,KAAK,EAAE;QACvB,IAAI,IAAI,CAACH,MAAM,CAACQ,YAAY,GAAG,IAAI,CAACR,MAAM,CAACS,WAAW,EAAE;YACtD,IAAI,CAACT,MAAM,CAACQ,YAAY;YACxBK,MAAM,IAAI,CAACF,UAAU;QACvB,OAAO,IAAI,CAACX,MAAM,CAACM,KAAK,CAACQ,IAAI,CAACD;IAChC;IAEAE,MAAMC,QAAuB,EAAE;QAC7B,IAAI,IAAI,CAAChB,MAAM,CAACE,aAAa,EAAE,MAAM,IAAIe,MAAM,CAAC,mCAAmC,EAAED,UAAU;QAC/F,IAAI,CAAChB,MAAM,CAACE,aAAa,GAAGc;QAC5B,IAAI,IAAI,CAAChB,MAAM,CAACG,KAAK,IAAI,CAAE,CAAA,IAAI,CAACH,MAAM,CAACM,KAAK,CAACC,MAAM,GAAG,IAAI,CAACP,MAAM,CAACQ,YAAY,AAAD,GAAI,OAAO,IAAI,CAACT,UAAU;IACzG;IAnDA,YAAYU,cAAsBS,QAAQ,CAAE;QAC1C,IAAI,CAAClB,MAAM,GAAG;YACZS;YACAH,OAAO,IAAIT;YACXW,cAAc;YACdL,OAAO;YACPD,eAAe;YACfD,aAAa;YACbI,UAAU;QACZ;QACA,IAAI,CAACN,UAAU,GAAG,IAAI,CAACA,UAAU,CAACoB,IAAI,CAAC,IAAI;QAC3C,IAAI,CAACR,UAAU,GAAG,IAAI,CAACA,UAAU,CAACQ,IAAI,CAAC,IAAI;IAC7C;AAwCF;AAvDA,SAAqBrB,mBAuDpB"} |
+1
-1
| { | ||
| "name": "queue-cb", | ||
| "version": "1.6.0", | ||
| "version": "1.6.1", | ||
| "description": "A scalable queue for parallel callbacks", | ||
@@ -5,0 +5,0 @@ "keywords": [ |
26348
-14.42%278
-9.15%