2.0.0 • Published 2 years ago

@simplyhexagonal/function-queue v2.0.0

Weekly downloads
-
License
Apache-2.0
Repository
-
Last release
2 years ago

Function Queue

Tests Try function-queue on RunKit

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:

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.

1.1.1

2 years ago

2.0.0

2 years ago

1.1.0

2 years ago

1.0.0

2 years ago