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 🙏

© 2026 – Pkg Stats / Ryan Hefner

ee-soa-transport-rewrite

v0.2.6

Published

Rewriting middleware for the ee-soa-transports

Downloads

27

Readme

#ee-soa-transport-rewrite Middleware to modify requests sent to a service. This module is under heavy development.

##Rewrites The module provides a basic set of rewrites. Rewrites are executable objects which modify a request based on a rule, to use the internal rewrites, the rules must at least have the following form. The middleware matches the domain and the path against the current http request to choose rules (see matching).

var rule = { name: ..., path: ..., field: ..., value: ..., domain: ... }

The name of the rule determines the corresponding rewrite class:

  • append appends the specified value to the header specified in field.
  • ensure checks if the header specified in field is present. If not it is set to field.
  • override overrides the header field with value.
  • method overrides the method of the request if the field value matches the incoming request method (rewrites all if field is not set) with its value
  • path modifies the requested pathname path to value (use to map to api endpoints).
  • template sets a template object on the request and binds the template to a key representing the status code of the response (saved in the field property. If no status is set, the template it is bound to a default key).
  • parameter allows setting arbitrary values to an parameters hashtable called rewriteParameters ( request.rewriteParameters[field] = value)

Further planned but not implemented or tested yet are:

  • extend extends an existing ruleset

Consider the following example:

var rule    = { domain: 'test.com', path: '/detail', name: 'ensure', field: 'select', value: '*' }
// is transformed to
var rewrite = new Ensure(rule, ...);
// and executed on the request
rewrite.execute(request, function(err){});

If the value field is of type 'function', it gets executed every time the rewrite rule is applied (e.g. a timing function)

Rewrites can be combined to a chain which then is executed sequentially (for development).

rewrite.then(new Ensure(...)).execute(request, function(err){});

###Matching The matching of the path of the rules is type based:

- if the path is `null` or '*' it is applied to all requests (which match the domain)
- if the path is of type string it is exactly matched e.g. `key == path`
- if the path is of type RegExp, a regexp matching is performed

##Loaders The rewrite module uses loaders to load rules from different sources. All loaders can be nested to combine loading/caching and transformation.

var loader =
{
    load: function(key, callback){
        var ruleset = //load your ruleset
        callback(err, ruleset);
    }
};

###FilterLoader A Loader that takes another loader and filters its results using the passed comparator. The comparator can be either a string which denotes the name of the rule property which is relevant for matching or a function. The later takes the key passed to the loader and a rule object to match to. The comparator has to adhere to the following contract:

1. Return true if the key can be matched with the rule
2. Return false if the key can not be matched with the rule
3. Throw an error if the rule has an unexpected form

If there is no comparator passed, the filter loader creates one itself: By default, the property which is taken into account is named key (rules are compared by their key property).

###TransformingLoader Takes a transformer (see transformers). The TransformingLoader passes the rule set returned by the loader to the transformer, which can transform the passed rules in any desired way before handing it back to the callback.

###InMemoryLoader A loader used to load rules from memory i.e. collections of rules. This loader is mainly for testing. The InMemoryLoader itself is a FilterLoader which reduces the full rule set to the rules which match a comparator (which can be passed or is created internally, see FilterLoader).

var rules  = [
    {domain: 'somewhere.com' ... }
    {domain: 'somewhere-else.com' ...}
    ...
];
var loader = new loaders.InMemoryLoader(rules, 'domain');
loader.load('somewhere.com', function(err, ruleset){ });

###CachedLoader A loader which takes a cache and another loader. All results returned by the inserted loader are written to the cache and taken from there if accessed again. This allows caching of slow rule sources such as a database, the network or the disk.

###DatabaseLoader Is currently in development, it probably does not make sense to have a default implementation.

###RewriteLoader Is a transforming loader which creates rewrite.Rewrite instances (or subclasses) from the rulesets to get executable rewrites and can be seen as a factory (internally uses the transformer.FactoryTransformer.

##Transformers Transformers are classes/objects to transform the loaded rulesets of a transformer that simply filters the rules based on the key value passed to the loader.

var transformer = {
    transform: function(key, resultset, callback){
        callback(null, resultset.filter(function(current){
            return current.key == key;
        }));
    }
}

var loader = new TransformingLoader(transformer, {load: function(err, cb){ cb(null, rules}; }};

##Caches Caches used with the cached loader must adhere to a simple interface:

var cache = {
    has:    function(key){}
    , get:  function(key){}
    , set:  function(key, value){}
}

Different caches are always injected into the loaders which makes them inherently testable.

#Changelog ##v0.2.0

- added the possibility to bind the templates to a status code using the field value (if none set it is bound to a default parameter). The template itself now is an object with a resolve method which takes the status code as a parameter).

##v0.1.5

- added a method rewrite to switch http methods

##v0.1.2

- added Option rewrite rule
- values which are of type function are evaluated now