@simplyhexagonal/function-queue
v2.0.0
Published
Convert functions into a rate-limited queue capable of processing payloads sequentially
Downloads
431
Readme
Function Queue
Description of function-queue.
Open source notice
This project is open to updates by its users, I ensure that PRs are relevant to the community. In other words, if you find a bug or want a new feature, please help us by becoming one of the contributors ✌️ ! See the contributing section
Like this module? ❤
Please consider:
- Buying me a coffee ☕
- Supporting Simply Hexagonal on Open Collective 🏆
- Starring this repo on Github 🌟
Install
pnpm i @simplyhexagonal/function-queue
# or
yarn add @simplyhexagonal/function-queue
# or
npm install @simplyhexagonal/function-queue
Usage
Queue multiple payloads and wait for all to complete:
import FunctionQueue, {
QueueableFunction,
} from '@simplyhexagonal/function-queue';
interface MyFnPayload {
greeting: string;
}
const myFn: QueueableFunction<MyFnPayload, string> = async ({greeting}) => {
const fnResult = `${greeting.toUpperCase()} World!`;
console.log(fnResult);
return fnResult;
};
const fnQueue = new FunctionQueue(
myFn,
{
waitTimeBetweenRuns: 100, //default
getResultTimeout: 60000, //default
maxRetries: 1, //default
cleanupResultsOlderThan: 60000, //default
}
);
fnQueue.queuePayload({greeting: 'Hello'});
fnQueue.queuePayload({greeting: 'Hey'});
fnQueue.queuePayload({greeting: 'Hi'});
fnQueue.queuePayload({greeting: 0 as any as string}); // This is bad and would obviously fail at runtime
fnQ.processQueue();
const results = await fnQ.processQueuePromise;
console.log(results);
// [
// { duration: 138, result: 'HELLO World!', ... },
// { duration: 104, result: 'HEY World!', ... }
// { duration: 104, result: 'HI World!', ... },
// {
// duration: 202,
// error: TypeError: greeting.toUpperCase is not a function
// ...
// }
// ]
Queue multiple payloads but only get the results you need:
import FunctionQueue, {
QueueableFunction,
} from '@simplyhexagonal/function-queue';
interface MyFnPayload {
greeting: string;
}
const myFn: QueueableFunction<MyFnPayload, string> = async ({greeting}) => {
const fnResult = `${greeting.toUpperCase()} World!`;
console.log(fnResult);
return fnResult;
};
const fnQueue = new FunctionQueue(myFn);
const payloadId1 = fnQueue.queuePayload({greeting: 'Hello'});
const payloadId2 = fnQueue.queuePayload({greeting: 0 as any as string}); // This is bad and would obviously fail at runtime
fnQ.processQueue();
let result;
result = await fnQ.getResult(payloadId2);
console.log(result);
// {
// duration: 202,
// error: TypeError: greeting.toUpperCase is not a function
// ...
// }
result = await fnQ.getResult(payloadId1);
console.log(result);
// { duration: 138, result: 'HELLO World!', ... },
A note regarding cleaning up the queue results
Results that have an endTimestamp
older than the cleanupResultsOlderThan
option will be cleaned
up automatically only when fnQ.processQueue()
or fnQ.getResult(...)
are called.
If you find results getting stuck in memory for too long and would like to clean them up either
manually or periodically, you can use the fnQ.cleanupResults()
method.
Contributing
Yes, thank you! This plugin is community-driven, most of its features are from different authors.
Please update the docs and tests and add your name to the package.json
file.
Contributors ✨
Thanks goes to these wonderful people (emoji key):
License
Copyright (c) 2021-Present Function Queue Contributors. Licensed under the Apache License 2.0.