1.0.7 • Published 2 years ago
nv-facutil-simple-ratelimit v1.0.7
nv-facutil-simple-ratelimit
- simple promise ratelimit
install
- npm install nv-facutil-simple-ratelimit
usage
const {creat_by_end_at,creat_by_begin_at} = require("nv-facutil-simple-ratelimit")
example
creat_by_end_at based on the task end-time
by_end_at is more reasonable
creat_by_begin_at based on the task begin-time
by_end_at
const _tmout = require('timers/promises').setTimeout;
var rl = creat_by_end_at(5,10000); // max 5 times every 10-seconds
var f = async (rl,name)=> {
console.log(`${name} pending at:`,new Date())
let sema = await rl.acquire();
{
console.log(`<${name} begin executing> at :`,new Date())
await _tmout(1500)
console.log(`</${name} finished> at:`,new Date())
}
sema.release();
}
for(let i=0;i<10;i++) {f(rl,`task${i}`)}
/*
task0 pending at: 2022-11-01T03:13:36.188Z
task1 pending at: 2022-11-01T03:13:36.189Z
task2 pending at: 2022-11-01T03:13:36.189Z
task3 pending at: 2022-11-01T03:13:36.190Z
task4 pending at: 2022-11-01T03:13:36.190Z
task5 pending at: 2022-11-01T03:13:36.190Z
task6 pending at: 2022-11-01T03:13:36.190Z
task7 pending at: 2022-11-01T03:13:36.190Z
task8 pending at: 2022-11-01T03:13:36.191Z
task9 pending at: 2022-11-01T03:13:36.191Z
Promise {
<pending>,
[Symbol(async_id_symbol)]: 83,
[Symbol(trigger_async_id_symbol)]: 5,
[Symbol(destroyed)]: { destroyed: false }
}
> <task0 begin executing> at : 2022-11-01T03:13:36.193Z
<task1 begin executing> at : 2022-11-01T03:13:36.193Z
<task2 begin executing> at : 2022-11-01T03:13:36.193Z
<task3 begin executing> at : 2022-11-01T03:13:36.193Z
<task4 begin executing> at : 2022-11-01T03:13:36.194Z
> </task0 finished> at: 2022-11-01T03:13:37.694Z
</task1 finished> at: 2022-11-01T03:13:37.695Z
</task2 finished> at: 2022-11-01T03:13:37.695Z
</task3 finished> at: 2022-11-01T03:13:37.695Z
</task4 finished> at: 2022-11-01T03:13:37.696Z
> <task5 begin executing> at : 2022-11-01T03:13:47.709Z
<task6 begin executing> at : 2022-11-01T03:13:47.709Z
<task7 begin executing> at : 2022-11-01T03:13:47.709Z
<task8 begin executing> at : 2022-11-01T03:13:47.709Z
<task9 begin executing> at : 2022-11-01T03:13:47.710Z
</task5 finished> at: 2022-11-01T03:13:49.216Z
</task6 finished> at: 2022-11-01T03:13:49.217Z
</task7 finished> at: 2022-11-01T03:13:49.217Z
</task8 finished> at: 2022-11-01T03:13:49.218Z
</task9 finished> at: 2022-11-01T03:13:49.218Z
*/
by_begin_at
const _tmout = require('timers/promises').setTimeout;
var rl = creat_by_begin_at(5,10000); // max 5 times every 10-seconds
var f = async (rl,name)=> {
console.log(`${name} pending at:`,new Date())
let sema = await rl.acquire();
{
console.log(`<${name} begin executing> at :`,new Date())
await _tmout(1500)
console.log(`</${name} finished> at:`,new Date())
}
sema.release();
}
for(let i=0;i<10;i++) {f(rl,`task${i}`)}
task0 pending at: 2022-11-01T03:16:20.462Z
task1 pending at: 2022-11-01T03:16:20.464Z
task2 pending at: 2022-11-01T03:16:20.465Z
task3 pending at: 2022-11-01T03:16:20.465Z
task4 pending at: 2022-11-01T03:16:20.466Z
task5 pending at: 2022-11-01T03:16:20.466Z
task6 pending at: 2022-11-01T03:16:20.466Z
task7 pending at: 2022-11-01T03:16:20.467Z
task8 pending at: 2022-11-01T03:16:20.467Z
task9 pending at: 2022-11-01T03:16:20.468Z
Promise {
<pending>,
[Symbol(async_id_symbol)]: 83,
[Symbol(trigger_async_id_symbol)]: 5,
[Symbol(destroyed)]: { destroyed: false }
}
> <task0 begin executing> at : 2022-11-01T03:16:20.470Z
<task1 begin executing> at : 2022-11-01T03:16:20.471Z
<task2 begin executing> at : 2022-11-01T03:16:20.471Z
<task3 begin executing> at : 2022-11-01T03:16:20.472Z
<task4 begin executing> at : 2022-11-01T03:16:20.472Z
> </task0 finished> at: 2022-11-01T03:16:21.974Z
</task1 finished> at: 2022-11-01T03:16:21.975Z
</task2 finished> at: 2022-11-01T03:16:21.975Z
</task3 finished> at: 2022-11-01T03:16:21.976Z
</task4 finished> at: 2022-11-01T03:16:21.977Z
>
>
> <task5 begin executing> at : 2022-11-01T03:16:31.986Z
<task6 begin executing> at : 2022-11-01T03:16:31.987Z
<task7 begin executing> at : 2022-11-01T03:16:31.987Z
<task8 begin executing> at : 2022-11-01T03:16:31.987Z
<task9 begin executing> at : 2022-11-01T03:16:31.987Z
</task5 finished> at: 2022-11-01T03:16:33.495Z
</task6 finished> at: 2022-11-01T03:16:33.495Z
</task7 finished> at: 2022-11-01T03:16:33.495Z
</task8 finished> at: 2022-11-01T03:16:33.495Z
</task9 finished> at: 2022-11-01T03:16:33.496Z
METHODS
rate limit
rl.acquire rl.avaliable_ rl.constructor rl.is_by_begin_mode
rl.is_by_end_mode rl.pending_ rl.pq_ rl.set_mode_to_by_begin
rl.set_mode_to_by_end rl.tmhist_ rl.used_
hist
hidden
tsk
hidden
APIS
- creat_by_end_at(max_count_per_tm_window=1,tm_window_msec=1000)
- creat_by_begin_at(max_count_per_tm_window=1,tm_window_msec=1000)
LICENSE
- ISC