npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

limited-promise

v0.1.0

Published

Rate Limited Promises powered by a credit-allowing Lazy Token Bucket

Downloads

24

Readme

limited-promise

Rate Limited Promises powered by a credit-allowing Lazy Token Bucket.

Installation

Using yarn...

$ yarn add limited-promise

Using npm...

$ npm install limited-promise --save

Usage

import LimitedPromise, { LimitedPromiseConfig } from 'limited-promise'

const config: LimitedPromiseConfig = {
  tokens: 10,      // maximum burst "immediate" usages
  tokenCredit: 10, // maximum tasks that can be scheduled
  rate: 10         // refill rate (requests per second)
}

const bucket = new LimitedPromise(config)

for (let i = 0; i <= 30; i++) {
  bucket
    .next()
    .then(() => doSomeTask())
}

In the above scenario, the first 10 tasks will fire immediately. The next 10 will fire once every 100ms. The last 10 tasks will get rejected immediately.

If new tasks arrive before the scheduled token debt has been paid off (time passes), then new tokens will be scheduled for the future.

Initial Balance

If you want to set a higher initial balance of tokens (to allow for a burst of tasks on app startup for example), you can pass a custom initial limit.

const config: LimitedPromiseConfig = {
  tokens: 10,      // maximum burst "immediate" usages
  tokenCredit: 10, // maximum tasks that can be scheduled
  rate: 10         // refill rate (requests per second)
}

const initialBalance: number = 100;

const bucket = new LimitedPromise(config, initialBalance);

Cancellation Handles

In certain scenarios, you may want to cancel one or more requests before they actually trigger. For example, if you have a page that makes many requests and the user navigates away before all of the requests have fired, you can cancel them using a handle. The handle must be passed in at the time that a token is requested from the bucket. This can be either a string or a number.

const bucket = new LimitedPromise()

const promise1 bucket.next('a').then(() => 'apples')
const promise2 bucket.next('a').then(() => 'and')
const promise3 bucket.next('b').then(() => 'bananas')

bucket.cancel('a')

// promise1 is rejected
// promise2 is rejected
// promise3 is the NEXT promise to resolve

Notes on Implementation

This uses setInterval and Date for scheduling and thus is restricted to that level of granularity.