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

callagain

v1.0.0-beta.7

Published

Call again failed calls

Downloads

12

Readme

CallAgain

This package help you to deal with function that:

  • should be called again with same arguments in case of some specific errors;
  • should not be called more than N time in some time unit;
  • should not be called simultaneously more then N times;

Installing

$ npm install callagain

Basic usage example

// Here is function, it makes direct call to some API
const {loadItemsFromRemoteServer} = requires('./lib');

// Import helper
const {CallAgain} = require('callagain');

// Create instance
const c = new CallAgain({
    // Concurrency settings
    maxConcurrentCalls: 10, // Extrernal API allows only 10 concurrent calls

    // Retry on error settings
    maxRetryAttempts: 5, // Try 5 time before throw error
    delayOnRetry: 5000, // If some call fails, wait 5 sec and try again
    
    // Rate limit settings
    maxCallsPerInterval: 50, // External API allows 50 calls per minute
    intervalLength: 60000 // External API allows 50 calls per minute
});

// Use helper's *wrap* method to create safe version of needed function
const safeLoadItems = c.wrap(loadItemsFromRemoteServer);

// Now we can simply call our function
for (int page=0; page<100; page++) {
    safeLoadItems(page)
        .then(items => {
    		// ...    
	    })
    	.catch(e => console.error(e.message))
}

Error handling

You can specify error handlers

const c = new CallAgain({...});

// wrapping axios get call
const getItems = c.wrap(url => axios.get);


c.onError((err, next) => {
    // here err is axios error
    
    // this function must return boolean value
    // indicating should CallAgain retry or not
    
    
    if (err.response.status >= 500) {
            // Unknown server error, retry in *delayOnRetry* milliseconds
            return true
    }  
        
    
    // if you do not know, how to deal with error, you should pass it to next handler
    return next(err)
});

//handlers han be chained
c.onError(...).onError(...).onError(...)

Rejecting all

You can reject all pending calls by calling rejectAll method

const c = new CallAgain({...});

c.wrap(() => new Promise(resolve => setTimeout(resolve, 1000)))().catch(e => {
    console.log(e) // "Reject reason"
});


setTimeout(() => {
   c.rejectAll("Reject reason") // optional value to pass to catch handler 
}, 500)