pace-keeper

Promise-based job throttler, a pace-keeper that helps to schedule and slow down fetch-requests or any other async jobs

Usage no npm install needed!

<script type="module">
  import paceKeeper from 'https://cdn.skypack.dev/pace-keeper';
</script>

README

Pacekeeper

Pacekeeper allows you to queue up and slow down large batch jobs when you need to comply with a certain speed limits. It might be useful when you need to issue a series of API calls but a service you use allows you to make only a limited amount of requests per second.

Concept example

    const { Pacekeeper } = require('pace-keeper')
    const pacekeeper = new Pacekeeper({ pace: 2, interval: 10000 }) //max speed: 2 requests per 10 seconds

    function some_job(id) {

        console.log(`Starting job #${id}`)
        return `Result of job #${id}: ok`
    }

    let IDs = [...(new Array(100)).keys()] //[0 ... 99]
    let jobs = IDs.map(i => pacekeeper.submit(some_job, i))

    // Print jobs schedule:
    jobs.foreEach(job => {

        console.log(`Job id=${job.id} has been submited`);
        console.log(`It's been scheduled to start at ${new Date(job.start)} with a delay of ${job.delay} ms`);
    })

    // Combine all jobs into a single Promise:
    let batch = Promise.all(jobs.map(job => job.promise)).then(() => console.log('all jobs are completed'))

    // the "jobs" variable at some point of time may look like this:
    /* jobs
    [
        {
            id: 0,
            delay: 1398,
            start: 1612989350001,
            promise: Promise { 'Result of job #0: ok' }
        },
        {
            id: 1,
            delay: 1399,
            start: 1612989350002,
            promise: Promise { 'Result of job #1: ok' }
        },
        {
            id: 2,
            delay: 11398,
            start: 1612989360001,
            promise: Promise { <pending> }
        },
        {
            id: 3,
            delay: 11399,
            start: 1612989360002,
            promise: Promise { <pending> }
        },
        {
            id: 4,
            delay: 21398,
            start: 1612989370001,
            promise: Promise { <pending> }
        },
        {
            id: 5,
            delay: 21399,
            start: 1612989370002,
            promise: Promise { <pending> }
        }, ...
    ]
    */

Telegram bot example


    const { Pacekeeper } = require('pace-keeper')
    const { Telegraf } = require('telegraf')

    // Create a Telegram bot using Telegraf framework: https://github.com/telegraf/telegraf    
    const bot = new Telegraf(process.env.BOT_TOKEN) // please, provide your bot token here
    bot.hears(['hi','Hi'], (ctx) => ctx.reply('Hey there')) //dummy skill: react on 'hi' message
    bot.launch()

    // Enable graceful bot shutdown
    process.once('SIGINT', () => bot.stop('SIGINT'))
    process.once('SIGTERM', () => bot.stop('SIGTERM'))

    // Now, use Pacekeeper to throttle message broadcast
    let pacekeeper = new Pacekeeper({ pace: 5 }) //Max 5 requests per second
    let text = "Hi, World!"
    let chats = [ ] // a large set of chat id's that you'd like to broadcast your message to
    let broadcast = Promise.all(
   
        chats.map( chat => pacekeeper.submit(() => bot.telegram.sendMessage(chat, text)).promise )
    )

    broadcast.then(() => console.log('done!'))