open-index/open-npm huggingface dataset:
npm package: @mrporter/mrp-locale-middleware
Description: manages user locale
Author: James Christian
Latest version: 0.0.8

# MRP Locale Express Middleware and Country Data Service

### Country Data
- Access and cache supported country data  
  - Country data periodically pulled from [this service](http://stash.vm.wtf.nap:7990/projects/MRP/repos/mrp-locale-info/browse)
  - A snapshot of this data is pre-packaged within this module and used when cannot access this data

### Express Middleware
- Calculates which locale should be applied to a user's request based on URL, GEO headers, preference cookies, etc.
- Adds a 'locale' object to the request object of the form:

```javascript
// note the country payload is defined by the "mrp-locale-info" project
request.locale === {
  country: {
      "iso": "MO",
      "name": "Macau",
      "region": "intl",
      "currency": "GBP",
      "localCurrency": "MOP"
  }, 
  languageISO: "en"
}
```

- (Default but optional) If a the URL requested contains a locale pre-fix that does not match the user's cookie preference, then redirect to the same URL but with their prefered locale

## Usage 

### Usage: Express Middleware

```javascript
var opts = {
	dataURL: "http://www.mrporter.com/locale-info/en/countries.json", // required
	cachePath: "./country-data-cache",   // Not recommended for clustered environmnets.  If ommited, use an in-memory cache
	preventFallbackToPrepackagedData: false, // optional, default: false
  hostOverride: "www.mrporter.com", // optional.  Relative paths used if not specified
	logger: winston // optional
}
app.use(require('@mrporter/mrp-locale-middleware').createLocaleMiddleware(opts));

```

### Usage: Country Service

```javascript
var opts = {
  dataURL: "http://www.mrporter.com/locale-info/en/countries.json", // required
  cachePath: "./country-data-cache",   // Not recommended for clustered environmnets.  If ommited, use an in-memory cache
  preventFallbackToPrepackagedData: false, // optional, default: false
  logger: winston // optional
}
var countryService = require('@mrporter/mrp-locale-middleware').CountryService(opts);
countryService.getSupportedCountry("FR", function(err, country) {
        if (err !== null) {
            // Something went wrong
        } else {
            // Do something with the country
            console.log("My Country data: " + JSON.stringify(country));
        }
    });

```

## TODO
- Timeouts for HTTP connection
- Consider connection pool, circuit breaker and retry policy for HTTP requests  
- Support non-English language
npm package: @mrporter/mrp-mod-rewrite
Description: adds reloadable modrewrite functionality to connect/express server
Author: James Christian
Latest version: 0.0.5

# mod_rewrite with remote config middleware

Middleware to configure an instance of [connect-modrewrite](https://github.com/tinganho/connect-modrewrite) which, it turn, rewrites URLs based on this configuration.  
- Comes pre-packaged with a rules snapshot, but should be configured to fetch a more up-to-date instance of the rules from a server.  
- Rules are cached to local disk.  
- The cache-control header of the resource at rulesURL is respected; including the ability to serve stale instances of the rule if problems occur downloading a new instance.

## Usage

```javascript
var opts {
    "rulesURL": "http://s3-eu-west-1.amazonaws.com/mod-rewrite-dev/mod-rewrite-test.conf", 
    "preventFallbackToPrepackagedRules": false, // Optional
    "hostnameForRedirects": "www.mrporter.com" // Optional.  Will revert to relative redirects if not specified
    "cacheFileLocation": "./rules-cache", # Not recommended in clustered setup. If specified, reads and writes cachced rules to the supplied file location
    "logger": winston
};
var modRewriteMiddleware = require('mrp-mod-rewrite').createRewriteMiddleware(opts);
app.use(modRewriteMiddleware);
```

## Important
- The resource at rulesURL must be returned with a MIME type ("content-type" header) of "text/plain"
- The resource at rulesURL should be returned with a "cache-control" header that includes a "max-age" and a "stale-while-revalidate" directive
  - If a "cache-control" header is not returned, defaults to 10 mins max age and 7-day stale

## TODO
- Timeouts for HTTP connection
- Consider connection pool, circuit breaker and retry policy for HTTP requests