Spaces:
Runtime error
Runtime error
var SapphireAsyncQueue = (function (exports) { | |
'use strict'; | |
var __defProp = Object.defineProperty; | |
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; | |
var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); | |
var __publicField = (obj, key, value) => { | |
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); | |
return value; | |
}; | |
// src/lib/AsyncQueueEntry.ts | |
var _AsyncQueueEntry = class _AsyncQueueEntry { | |
constructor(queue) { | |
__publicField(this, "promise"); | |
__publicField(this, "resolve"); | |
__publicField(this, "reject"); | |
__publicField(this, "queue"); | |
__publicField(this, "signal", null); | |
__publicField(this, "signalListener", null); | |
this.queue = queue; | |
this.promise = new Promise((resolve, reject) => { | |
this.resolve = resolve; | |
this.reject = reject; | |
}); | |
} | |
setSignal(signal) { | |
if (signal.aborted) | |
return this; | |
this.signal = signal; | |
this.signalListener = () => { | |
const index = this.queue["promises"].indexOf(this); | |
if (index !== -1) | |
this.queue["promises"].splice(index, 1); | |
this.reject(new Error("Request aborted manually")); | |
}; | |
this.signal.addEventListener("abort", this.signalListener); | |
return this; | |
} | |
use() { | |
this.dispose(); | |
this.resolve(); | |
return this; | |
} | |
abort() { | |
this.dispose(); | |
this.reject(new Error("Request aborted manually")); | |
return this; | |
} | |
dispose() { | |
if (this.signal) { | |
this.signal.removeEventListener("abort", this.signalListener); | |
this.signal = null; | |
this.signalListener = null; | |
} | |
} | |
}; | |
__name(_AsyncQueueEntry, "AsyncQueueEntry"); | |
var AsyncQueueEntry = _AsyncQueueEntry; | |
// src/lib/AsyncQueue.ts | |
var _AsyncQueue = class _AsyncQueue { | |
constructor() { | |
/** | |
* The promises array | |
*/ | |
__publicField(this, "promises", []); | |
} | |
/** | |
* The amount of entries in the queue, including the head. | |
* @seealso {@link queued} for the queued count. | |
*/ | |
get remaining() { | |
return this.promises.length; | |
} | |
/** | |
* The amount of queued entries. | |
* @seealso {@link remaining} for the count with the head. | |
*/ | |
get queued() { | |
return this.remaining === 0 ? 0 : this.remaining - 1; | |
} | |
/** | |
* Waits for last promise and queues a new one | |
* @example | |
* ```typescript | |
* const queue = new AsyncQueue(); | |
* async function request(url, options) { | |
* await queue.wait({ signal: options.signal }); | |
* try { | |
* const result = await fetch(url, options); | |
* // Do some operations with 'result' | |
* } finally { | |
* // Remove first entry from the queue and resolve for the next entry | |
* queue.shift(); | |
* } | |
* } | |
* | |
* request(someUrl1, someOptions1); // Will call fetch() immediately | |
* request(someUrl2, someOptions2); // Will call fetch() after the first finished | |
* request(someUrl3, someOptions3); // Will call fetch() after the second finished | |
* ``` | |
*/ | |
wait(options) { | |
const entry = new AsyncQueueEntry(this); | |
if (this.promises.length === 0) { | |
this.promises.push(entry); | |
return Promise.resolve(); | |
} | |
this.promises.push(entry); | |
if (options?.signal) | |
entry.setSignal(options.signal); | |
return entry.promise; | |
} | |
/** | |
* Unlocks the head lock and transfers the next lock (if any) to the head. | |
*/ | |
shift() { | |
if (this.promises.length === 0) | |
return; | |
if (this.promises.length === 1) { | |
this.promises.shift(); | |
return; | |
} | |
this.promises.shift(); | |
this.promises[0].use(); | |
} | |
/** | |
* Aborts all the pending promises. | |
* @note To avoid race conditions, this does **not** unlock the head lock. | |
*/ | |
abortAll() { | |
if (this.queued === 0) | |
return; | |
for (let i = 1; i < this.promises.length; ++i) { | |
this.promises[i].abort(); | |
} | |
this.promises.length = 1; | |
} | |
}; | |
__name(_AsyncQueue, "AsyncQueue"); | |
var AsyncQueue = _AsyncQueue; | |
exports.AsyncQueue = AsyncQueue; | |
return exports; | |
})({}); | |
//# sourceMappingURL=out.js.map | |
//# sourceMappingURL=index.global.js.map |