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

the-handbrake

v0.7.0

Published

Permanently cache HTTP responses from other servers.

Downloads

5

Readme

handbrake

Permanently cache HTTP responses from other servers.

USAGE

    hb serve <server> [--port=<local port>] [--database-file=<file>] [--ignore=<header>]...
    hb ls [<id>] [--database-file=<file>]
    hb (--help | --version)

INSTALL

    npm install -g the-handbrake

SYNOPSIS

the handbrake is a proxy server that locally caches responses from the server we're proxying to. Therefore, any subsequent request that matches one prior will be served said cached response.

This is useful when you need to rapidly test against slow APIs and the like and you don't mind getting stale data, but it must be real world and semantically valid: make the request once, the handbrake caches it, and serves said response henceforth.

See the MOTIVATION section for more information.

the handbrake stops HTTP Requests. the handbrake stops all.

TERMINOLOGY

Request Profile

An object consisting of a HTTP Method, a specific URL, any number of header:value request pairs, and a cached response {status code, headers, body}.

Matching

Each time a request to the handbrake is made, it is compared to all Request Profiles in the database, and if the method, url, and all of the request headers are the same as a specific Request Profile, the request is considered to have 'matched' said Request Profile.

N.B.: If a request matches a Request Profile's method and url, but the set of respective headers differ, the request does not match the Request Profile.

Ignoring

Sometimes, when matching requests to Request Profiles, you want to ignore common headers that can vary from environment to environment and aren't really relevant to a returned response. Once such example is the User-Agent header, which varies from browser to browser, but generally isn't relevant when testing HTTP APIs.

If you would like to tell the handbrake to ignore such headers, when starting an instance with `serve`, specify one or more `--ignore` (or `-i`) flags like so:

    $ hb serve http://bizbang.example -i Accept -i User-Agent

MOTIVATION

Testing HTTP APIs is hard and unfun. Testing slow HTTP APIs is even less fun. the handbrake tries to remedy that by standing in-between you and your slow API server: the first time you request a URL, the handbrake forwards your request to the target server, then caches that response and serves it for all subsequent requests that match that initial request (cf. TERMINOLOGY section: matching).

And/or, once you populated the handbrake database with a relevant collection of endpoints, you can use the handbrake for unit testing: point your unit test requests (with the same set of headers/credentials/body/etc. that you would normally use for real-world requests) at a running handbrake instance, and it will return the stored mocked responses. Instead of testing against a potentially constantly changing (and/or slow) production API, you can use the handbrake to test against prior-received, ideally real-world data.

Additionally, as a side-effect of how the handbrake works, you can also use it to cache pages of your choice offline: first, just visit all of the desired pages through the handbrake proxy, and then just disconnect from the internet and connect again to the same handbrake database. Cached requests stay in the database forever (unless deleted), and if you get a cache hit, your request is short-circuited to the handbrake, and actually doesn't need to hit the internet.

EXAMPLES

Proxies (and then caches the responses to) requests from localhost:8001 to https://foobar.example:564 using the default database file location (creating one if one does not exist at said location):

    $ hb serve https://foobar.example:564

Proxies (and then caches the responses to) requests from localhost:9999 to http://192.168.56.102:1234, using '/tmp/hb.db' as the database file (creating one if one does not exist at said location), ignoring the 'Accept' and 'User-Agent' header values when matching requests:

    $ hb serve 192.168.56.102:1234 -p 9999 -d /tmp/hb.db -i Accept -i User-Agent

List all Request Profiles (sans their response bodies) using the database file located at '/tmp/hb.db':

    $ hb ls --database-file=/tmp/hb.db

List the Request Profile HTTP Response for id 052fd15c-0009-11e8-84a8-6fe2898c8078 using the default database:

    $ hb ls 052fd15c-0009-11e8-84a8-6fe2898c8078:

COMMANDS

serve <server> [--port=<local port>] [--database-file=<file>] [--ignore=<header>]...

Starts up a server listening on localhost:$port that proxies (and then caches the responses to) requests sent to $server, ignoring the given user-specified header values and saving the Request Profiles to the given $database-file.

You can also specify a port for the $server in the conventional manner, i.e.:

    example.com:8080

The default database file location is one of:

  • $XDG_CONFIG_HOME/handbrake/rp.db, if $XDG_CONFIG_HOME exists or
  • $HOME/.config/handbrake/rp.db if it does not.

ls [<id>] [--database-file=<file>]

Pretty-print Request Profiles to stdout.

If the $id argument is given, the entire Request Profile HTTP Response is printed.

See the serve command section for more information about the --database-file option.

OPTIONS

    -p, --port=<local port>    The local port you want the handbrake to listen for request on [default: 8001].
    -d, --database-file=<file> The database file you would like to use (default: '$XDG_CONFIG_HOME/handbrake/rp.db', if $XDG_CONFIG_HOME is set, or '$HOME/.config/handbrake/rp.db').
    -i, --ignore=<header>      Specify that the given header should be ignored when matching requests to Request Profiles.
    -h, --help                 Show this help text.
    -v, --version              Provide version information.