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

freeloader

v0.0.3

Published

Stream-based HTTP load testing framework

Downloads

83

Readme

freeloader

Just a super easy load-testing framework.

  • no complex GUI to get lost in
  • load tests == code, and yes you should check them in :)
  • easy to plug-in to your CI server
  • get started in seconds

NPM

Getting started

Freeloader uses 4 basic keywords:

  • request to create an HTTP request using unirest
  • emit to push the request down the pipeline
  • send to make the actual HTTP call
  • join to join 2 streams together

The simplest test looks like:

require('freeloader').global();

// See unirest documentation for all the options (headers, file uploads...)
var r = request.get('http://localhost:3000/people')
               .header('Accept', 'application/json');

emit(r).pipe(send());

That's it! This test sends a single HTTP request, and finishes as soon as the response is received.

Building a pipeline

It becomes a lot more interesting when we start building a pipeline. Each step in the pipeline has access to all requests & responses. They can modify payloads, generate more requests, or collect data for reporting.

freeloader-bundle contains a lot of useful modules to get started. Each module is an instance of a Node.js stream, and you can also easily create your own.

require('freeloader-bundle').global();

emit(r)
.pipe(stopTimer('30s'))
.pipe(concurrent(50))
.pipe(transform(randomData))
.pipe(progressDots())
.pipe(consoleSummary())
.pipe(responseTimeGraph('./graph.jpg'))
.pipe(send())

Which outputs something like:

............................................................
....................................................

Waiting for pending requests to finish...

Response count = 112

Response times
  Min             =  16ms
  Max             = 182ms
  Mean            =  66ms
  Median          =  58ms
  75th percentile =  82ms
  95th percentile = 150ms

The test suite will end:

  • when every request has been sent
  • or when you press Ctrl-C
  • or when a module adds its own stopping condition

Test pipelines can easily be included in a CI test suite:

it('generates load test reports', function(done) {
  emit(r1)
  .pipe(times(50))
  .pipe(jsonSummary('./report.json'))
  .pipe(callback(done))
  .pipe(send());
});

Joining streams

Streams can also be joined for more complex scenarios. Here are a few examples:

  • Emit 2 different requests with a total concurrency of 50
join(emit(r1), emit(r2))
.pipe(concurrent(50))
.pipe(summary())
.pipe(send());
  • Emit 2 different requests with a concurrency of 50 each
var s1 = emit(r1).pipe(concurrent(50));
var s2 = emit(r2).pipe(concurrent(50));
join(s1, s2)
.pipe(summary())
.pipe(send());

It's up to each reporter to either give global stats, or group the report by request URL.