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

parallel-http-request

v1.1.3

Published

Simplicity to create multiple HTTP Request in Parallel for NodeJS

Downloads

165

Readme

parallel-http-request

NPM

npm version Build Status Coverage Status Known Vulnerabilities NPM download/month NPM download total
Simplicity to create multiple HTTP Request in Parallel for NodeJS.

Install using NPM

$ npm install parallel-http-request

Usage

Set Config

var ParallelRequest = require('parallel-http-request');

var config = {
    response: "simple"    // [optional] detail|simple|unirest, if empty then the response output is simple
};

var request = new ParallelRequest(config);

//or without config
var request = new ParallelRequest();

The config.response options value is :

  • simple : minimalist output response.
  • detail : output response very detail.
  • unirest : output response with unirest format.

Make Request

request.add('https://jsonplaceholder.typicode.com/posts/1')
    .add('https://jsonplaceholder.typicode.com/posts/2')
    .send(function(response){
        console.log(response);
    });

// or
request.add({url:'https://jsonplaceholder.typicode.com/posts/1',method:'get'})
    .add({url:'https://jsonplaceholder.typicode.com/posts/2',method:'get'})
    .send(function(response){
        console.log(response);
    });

// or mixed it
request.add({
        url:'https://jsonplaceholder.typicode.com/posts/1',
        method:'get'
    })
    .add({
        url:'https://jsonplaceholder.typicode.com/posts/2',
        method:'post',
        headers:{'Content-Type':'application/json'},
        body: {
            fullname:'value',
            address:'value'
        }
    })
    .add({
        url:'https://jsonplaceholder.typicode.com/posts/3',
        method:'delete',
        headers:{'Content-Type':'application/json'},
        body: {
            fullname:'value',
            address:'value'
        }
    })
    .send(function(response){
        console.log(response);
    });

Documentation

This Parallel HTTP Request is created based on unirest-nodejs library, so request.options is almost similar with unirest.

Note:

  • This library is intended to create multiple request in parallel, so not all unirest feature is worked. Please see Limitation.

request.add(options)

To make a multiple http request, you have to use .add() for each request.
request.add(string|object) this will add your request into collection.

  • request.add(string) this request will use default method GET.
  • request.add(object) this request will use object options.

request.send(callback)

This will execute your multiple request.
Return output is always array object.

request.send(function(response){
        console.log(response)
    });

Options object in request.add(options)

  • url: (String) - Url to send the request.
  • method: (String) - Default GET; HTTP Method.
  • headers: (Object) - Default {}; HTTP Headers.
  • query: (Object) - HTTP URI Parameter.
  • body: (String | Object) - Entity body for certain requests.
  • form: (Object) - Form Data.
  • field: (Object) - Form fields.
  • attach: (Object) - For handle files.
  • followRedirect: (Boolean) - Default true; Follow HTTP 3xx responses as redirects.
  • followAllRedirects: (Boolean) - Default false; Follow Non-GET HTTP 3xx responses as redirects.
  • maxRedirects: (Number) - Default 10; Maximum number of redirects before aborting.
  • timeout: (Number) - Number of milliseconds to wait before aborting.
  • encoding: (String) - Encoding to be used on setEncoding of response data.
  • strictSSL: (Boolean) - Default true; Sets strictSSL flag to require that SSL certificates be valid.
  • httpSignature: (Object) - HTTP Signature.
  • proxy: (String) - HTTP Proxy.
  • secureProtocol: (Object) - Sets the secure protocol to use.
  • localAddress: (Object) - Sets localAddress, local interface to bind for network connections.
  • auth: (Object) - Accepts either an Object containing user, pass, and optionally sendImmediately.
  • aws: (Object) - Sets aws, AWS Signing Credentials.
  • hawk: (Object) - Sets hawk, HAWK Signing Credentials.
  • cookie: (String) - Creates a cookie.

request.remove(name)

This will remove url in collection.

  • name is the url of the request.
request.remove('http://google.com');

request.clean()

This will cleanup all request in collection.

request.clean();

request.getCollection()

This will return all request in collection.

request.getCollection();

request.unirest

If you want to use unirest (the underlying layer of parallel-http-request) directly.
Because Sometimes we are not always have to call request in parallel.
Please see Unirest Documentation.

request.unirest.get('http://google.com')
    .end(function(response){
        console.log(response.body)
    });

Example

Request with Method

You can just set method request by like this

request.add({url:'https://www.google.com', method:'get'});
request.add({url:'https://www.google.com', method:'post'});
request.add({url:'https://www.google.com', method:'put'});
request.add({url:'https://www.google.com', method:'patch'});
request.add({url:'https://www.google.com', method:'delete'});
request.add({url:'https://www.google.com', method:'head'});
request.add({url:'https://www.google.com', method:'options'});

Request with Query / Body / Form

POST with Query Parameter
request.add({
        url:'https://jsonplaceholder.typicode.com/posts/1', 
        method:'post', 
        query: {
            search:'value'
        }
    });
POST with Body
request.add({
        url:'https://jsonplaceholder.typicode.com/posts/1', 
        method:'post',
        headers:{'Content-Type':'application/json'}
        body: {
            fullname:'value',
            address:'value'
        }
    });
POST with Form Data Encoded
request.add({
        url:'https://jsonplaceholder.typicode.com/posts/1', 
        method:'post',
        headers:{'Content-Type':'application/x-www-form-urlencoded'}
        form: {
            fullname:'value',
            address:'value'
        }
    })
    .add({
        url:'https://jsonplaceholder.typicode.com/posts/2', 
        method:'post',
        headers:{'Content-Type':'application/x-www-form-urlencoded'}
        body: JSON.stringify({
            fullname:'value',
            address:'value'
        })
    })
    .add({
        url:'https://jsonplaceholder.typicode.com/posts/3', 
        method:'post',
        headers:{'Content-Type':'application/x-www-form-urlencoded'}
        body: 'name=nijiko&pet=turtle'
    });
POST with Body HTML / Other
request.add({
        url:'https://jsonplaceholder.typicode.com/posts/1', 
        method:'post',
        headers:{'Content-Type':'text/html'}
        body: '<strong>Hello World!</strong>'
    });

Request with Upload File

request.add({
        url:'http://mockbin.com/request',
        method:'post',
        headers:{
            'Content-Type': 'multipart/form-data',
            'Content-Length': fs.statSync(path.resolve('favicon.ico')).size
        },
        attach:{
            'file':fs.createReadStream(path.resolve('favicon.ico')),
            'remote file':request.unirest.request('http://google.com/favicon.ico')
        }
    });

Request with timeout

request.add({
        url:'http://www.google.com',
        timeout:60000
    });

Request with encoding

request.add({
        url:'http://www.google.com',
        encoding:'utf-8'
    });

Request with followRedirect

request.add({
        url:'http://www.google.com',
        followRedirect:true
    });

Request with maxRedirects

request.add({
        url:'http://www.google.com',
        maxRedirects:5
    });

Request with strictSSL

request.add({
        url:'https://www.google.com',
        strictSSL:false
    });

Request with proxy

request.add({
        url:'http://www.google.com',
        proxy:'http://localproxy.com'
    });

Request with secureProtocol

request.add({
        url:'https://www.google.com',
        secureProtocol:'SSLv3_client_method'
    });

Request with localAddress

request.add({
        url:'http://www.google.com',
        localAddress:'127.0.0.1'
    });

Request with auth

request.add({
        url:'http://www.google.com',
        auth:{
            user: 'Nijiko',
            pass: 'insecure',
            sendImmediately: true
        }
    });

Request with aws

request.add({
        url:'http://www.google.com',
        aws:{
            key: 'AWS_S3_KEY',
            secret: 'AWS_S3_SECRET',
            bucket: 'BUCKET NAME'
        }
    });

Request with hawk

request.add({
        url:'http://www.google.com',
        hawk:{
            credentials: {
                key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',
                algorithm: 'sha256',
                user: 'Steve'
            }
        }
    });

Request with cookie

Create request with cookie. Please see documentation.

request.add({
        url:'http://www.google.com',
        cookie:'yummy_cookie=choco; tasty_cookie=strawberry'
    });

Request with Jar

Creates a container to store multiple cookies, i.e. a cookie jar.

var cookieJar = request.jar;
cookieJar.add(request.cookie('yummy_cookie=choco; tasty_cookie=strawberry'));
// or as argument
cookieJar.add('key=value', '/');

request.add({
        url:'http://google.com',
        jar:cookieJar
    });

Limitation

There is several feature which is not posible to do with multiple parallel request.

  • oauth - Sets oauth, list of oauth credentials.
  • part - Still Experimental; Similiar to request multipart.
  • then - promise function.
  • pool - Single request; for socket connection which is use for single connection.
  • forever - Keeps socket connections alive between keep-alive in requests.

The solution about this limitation is you have to directly use unirest libary.

Example to use Unirest directly

Request with oAuth

request.unirest
  .get('https://api.twitter.com/oauth/request_token')
  .oauth({
    callback: 'http://mysite.com/callback/',
    consumer_key: 'CONSUMER_KEY',
    consumer_secret: 'CONSUMER_SECRET'
  })
  .then(response => {
    let access_token = response.body
 
    return request.unirest
      .post('https://api.twitter.com/oauth/access_token')
      .oauth({
        consumer_key: 'CONSUMER_KEY',
        consumer_secret: 'CONSUMER_SECRET',
        token: access_token.oauth_token,
        verifier: token: access_token.oauth_verifier
      })
  })
  .then((response) => {
    var token = response.body
 
    return request.unirest
      .get('https://api.twitter.com/1/users/show.json')
      .oauth({
        consumer_key: 'CONSUMER_KEY',
        consumer_secret: 'CONSUMER_SECRET',
        token: token.oauth_token,
        token_secret: token.oauth_token_secret
      })
      .query({
        screen_name: token.screen_name,
        user_id: token.user_id
      })
  })
  .then((response) => {
    console.log(response.body)
  });

Please see Unirest Documentation.

Unit Test

$ npm test