async-std
TypeScript icon, indicating that this package has built-in type declarations

0.5.0 • Public • Published

async-std

Modern package with utilities for concurrency programming on nodejs

Semaphore

Helps to limit simultaneous access to a resource.

import {Semaphore} from 'async-std';

const semaphore = new Semaphore(1);

await semaphore.execute(async () => {
    // work
})

Mutex

Mutex is a special case of Semaphore with capacity = 1.

import {Mutex} from 'async-std';

const lock = new Mutex();

lock.execute(async () => {
    // work
});

// wait when lock will be release
await lock.drain();

AsyncWorkerPool

Pool of workers to execute code concurrency with limit of concurrent operations at once.

import {AsyncWorkerPool} from 'async-std';

const pool = new AsyncWorkerPool(
    async (payload: { id: number }) => {
        // some work
    },
    // how many workers will be runned concurently
    1
);

pool.execute({ id: 5 });

// wait when all tasks will be executed
await pool.drain();

AsyncRateLimitWorkerPool

Pool of workers to execute code concurrency with limit of concurrent operations at one time period (N executes in X time window).

import {AsyncRateLimitWorkerPool} from 'async-std';

const pool = new AsyncRateLimitWorkerPool(
    async (payload: { id: number }) => {
        // some work
    },
    // how many workers will be runned concurently
    5,
    // 5 jobs will be executed every 1 second
    1000
);

pool.execute({ id: 5 });

// wait when all tasks will be executed
await pool.drain();

AsyncQueue

Sometimes it's needed to control the limits of tasks that will be executed by pools of workers. FIFO (first-in-first-out)

import {AsyncQueue, AsyncWorkerPool} from 'async-std';

const pool = new AsyncWorkerPool(
    async (payload: { id: number }) => {
        // some work
    },
    // how many workers will be runned concurently
    1
);

const queue = new AsyncQueue(pool, 100);

// Resolve promise that put task in queue that will be resolved by pool of workers
await pool.push({ id: 5 });

// wait when all tasks will be executed
await pool.drain();

AsyncStack

Similar as AsyncQueue but it's FILO (first-in-last-out)

import {AsyncStack, AsyncWorkerPool} from 'async-std';

const pool = new AsyncWorkerPool(
    async (payload: { id: number }) => {
        // some work
    },
    // how many workers will be runned concurently
    1
);

const queue = new AsyncStack(pool, 100);

// Resolve promise that put task in queue that will be resolved by pool of workers
await pool.push({ id: 5 });

// wait when all tasks will be executed
await pool.drain();

Helpers

asyncInterval

Execute function periodically (interval) before it will return value !== false

await asyncInterval(
    async () => {
        const user = await myawesomefn();
        if (user) {
            // doing somethings

            return user;
        }

        // return false to retry it
        return false;
    },
    100
)

retry

Retry function on exception

await retry(
    async () => {
        //
    },
    {
        // retry 3 times on exceptions
        retriesMax: 3,
    }
)

createPromiseLock

Lock execution context in place by promise and ability to resolve this lock.

import {createPromiseLock, PromiseLock} from 'async-std';

class Execute {
    protected readonly lock: PromiseLock = createPromiseLock();

    async function execute()
    {
        process.on('SIGTERM', async () => {
            console.info('Got SIGTERM. Graceful shutdown start', new Date().toISOString());

            this.lock.resolve();
        })

        await this.lock.promise;
    }
}

LICENSE

This project is open-sourced software licensed under the MIT License.

See the LICENSE file for more information.

Readme

Keywords

none

Package Sidebar

Install

npm i async-std

Weekly Downloads

0

Version

0.5.0

License

MIT

Unpacked Size

26.2 kB

Total Files

36

Last publish

Collaborators

  • ovr