1.0.7 • Published 2 years ago

nv-facutil-simple-ratelimit v1.0.7

Weekly downloads
-
License
ISC
Repository
-
Last release
2 years ago

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