pace-keeper
v1.2.3
Published
Promise-based job throttler, a pace-keeper that helps to schedule and slow down fetch-requests or any other async jobs
Downloads
16
Maintainers
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!'))