
Security News
The Hidden Blast Radius of the Axios Compromise
The Axios compromise shows how time-dependent dependency resolution makes exposure harder to detect and contain.
@xtia/async-queue
Advanced tools
A lightweight but powerful asynchronous task queuing system, with smart task priority and configurable concurrency limit
A lightweight but powerful asynchronous task queuing system, with smart task priority and configurable concurrency limit.
npm i @xtia/async-queue
import { AsyncQueue } from "@xtia/async-queue";
// create a queue with default options
// (maxConcurrent = 1)
const queue = new AsyncQueue();
// enqueue a task with a Promise-like interface:
// (enqueuing methods return a promise that forwards the task's resolution)
const text = await queue.promise<Response>(resolve => {
fetch(someUrl).then(resolve);
}).then(r => r.text());
// enqueue a task with a specific priority:
queue.promise(resolve => {
someAsyncOperation().then(resolve);
}, 1);
As well as resolution, promise rejection is forwarded by enqueuing methods:
queue.promise((resolve, reject) => {
fetch("doesntexist.lol").then(resolve, reject);
}).catch((err) => console.warn("fetch failed:", err));
queue.createFunc()createFunc(fn, priority?) lets us easily convert asynchronous functions to identically-signed functions that place their behaviour in the queue.
const queue = new AsyncQueue({
maxConcurrent: 3, // allow 3 notifications to be shown at a time
});
// we have a normal function to show a notification
function showNotification(level: "info" | "warning", message: string) {
return new Promise(resolve => {
// ... code to show notification
// resolve when removed by click or timeout
});
}
// wrap it so that its behaviour is queued when called
export const enqueueNotification = queue.createFunc(showNotification);
// function's signature is maintained, but calls are automatically enqueued:
enqueueNotification("info", "Download complete");
When wrapping the function, we can provide a priority for that function, or a function to determine a call's priority from its arguments:
// prioritise warnings
export const enqueueNotification = queue.createFunc(
showNotification,
(level, message) => level == "warning" ? 1 : 2
);
// wrap builtins, fixed priority
const enqueueFetch = queue.createFunc(fetch, 2);
const urgentFetch = queue.createFunc(fetch, 1);
// all type information is inherited from fetch
queue.enqueueFunc()enqueueFunc(fn, priority?) adds an asynchronous function to the queue without wrapping it with createFunc.
async function getData(url: string) {
const response = await fetch(url);
return await response.json();
}
const data = await queue.enqueueFunc(() => getData("data.json"));
AsyncQueue's constructor can be passed an object with the following properties
maxConcurrent: numberSpecifies how many tasks can be processed at a time. Default is 1.
defaultPriority: numberSpecifies a standard priority. Default is 5.
delayMs: numberSpecifies a delay between a queued task's completion and its concurrency slot becoming available for another task. Default is 0.
paused: booleanIf true, the queue will start in a paused state; enqueued tasks will not be processed until resume() is called. Default is false.
queue.pause() and queue.resume() halt and resume queue processing.queue.clear() removes all queued tasks.queue.panic(value?) rejects and removes all queued tasks.These methods do not affect active, on-going tasks.
FAQs
A lightweight but powerful asynchronous task queuing system, with smart task priority and configurable concurrency limit
We found that @xtia/async-queue demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
The Axios compromise shows how time-dependent dependency resolution makes exposure harder to detect and contain.

Research
A supply chain attack on Axios introduced a malicious dependency, plain-crypto-js@4.2.1, published minutes earlier and absent from the project’s GitHub releases.

Research
Malicious versions of the Telnyx Python SDK on PyPI delivered credential-stealing malware via a multi-stage supply chain attack.