Package detail

tenso

avoidwork93BSD-3-Clause17.2.4

Tenso is an HTTP REST API framework

rest, api, cqrs, gateway

readme

Tenso

Tenso is an HTTP REST API framework, that will handle the serialization & creation of hypermedia links; all you have to do is give it Arrays or Objects.

Example

Creating an API with Tenso can be this simple:

import {tenso} from "tenso";

export const app = tenso();

app.get("/", "Hello, World!");
app.start();

Creating Routes

Routes are loaded as a module, with each HTTP method as an export, affording a very customizable API server.

You can use res to res.send(body[, status, headers]), res.redirect(url), or res.error(status[, Error]).

The following example will create GET routes that will return an Array at /, an Error at /reports/tps, & a version 4 UUID at /uuid.

As of 10.3.0 you can specify always as a method to run middleware before authorization middleware, which will skip always middleware registered after it (via instance methods).

As of 17.2.0 you can have routes exit the middleware pipeline immediately by setting them in the exit Array. This differs from unprotect as there is no request body handling.

Example

Routes
import {randomUUID as uuid} from "crypto";

export const initRoutes = {
    "get": {
        "/": ["reports", "uuid"],
        "/reports": ["tps"],
        "/reports/tps": (req, res) => res.error(785, Error("TPS Cover Sheet not attached")),
        "/uuid": (req, res) => res.send(uuid(), 200, {"cache-control": "no-cache"})
    }
};
Server
import {tenso} from "tenso";
import {initRoutes} from "./routes";

export const app = tenso({initRoutes});

app.start();

Protected Routes

Protected routes are routes that require authorization for access, and will redirect to authentication end points if needed.

Unprotected Routes

Unprotected routes are routes that do not require authorization for access, and will exit the authorization pipeline early to avoid rate limiting, csrf tokens, & other security measures. These routes are the DMZ of your API! You must secure these end points with alternative methods if accepting input!

Reserved Route

The /assets/* route is reserved for the HTML browsable interface assets; please do not try to reuse this for data.

Request Helpers

Tenso decorates req with "helpers" such as req.allow, req.csrf, req.ip, req.parsed, & req.private. PATCH, PUT, & POST payloads are available as req.body. Sessions are available as req.session when using local authentication.

Tenso decorates res with "helpers" such as res.send(), res.status(), & res.json().

Extensibility

Tenso is extensible, and can be customized with custom parsers, renderers, & serializers.

Parsers

Custom parsers can be registered with server.parser('mimetype', fn); or directly on server.parsers. The parameters for a parser are (arg).

Tenso has parsers for:

  • application/json
  • application/x-www-form-urlencoded
  • application/jsonl
  • application/json-lines
  • text/json-lines

Renderers

Custom renderers can be registered with server.renderer('mimetype', fn);. The parameters for a renderer are (req, res, arg).

Tenso has renderers for:

  • application/javascript
  • application/json
  • application/jsonl
  • application/json-lines
  • text/json-lines
  • application/yaml
  • application/xml
  • text/csv
  • text/html

Serializers

Custom serializers can be registered with server.serializer('mimetype', fn);. The parameters for a serializer are (arg, err, status = 200, stack = false).

Tenso has two default serializers which can be overridden:

  • plain for plain text responses
  • custom for standard response shape
{
  "data": "`null` or ?",
  "error": "`null` or an `Error` stack trace / message",
  "links": [],
  "status": 200
}

Responses

Responses will have a standard shape, and will be utf-8 by default. The result will be in data. Hypermedia (pagination & links) will be in links:[ {"uri": "...", "rel": "..."}, ...], & also in the Link HTTP header.

Page size can be specified via the page_size parameter, e.g. ?page_size=25.

Sort order can be specified via then order-by which accepts [field ]asc|desc & can be combined like an SQL 'ORDER BY', e.g. ?order_by=desc or ?order_by=lastName%20asc&order_by=firstName%20asc&order_by=age%20desc

REST / Hypermedia

Hypermedia is a prerequisite of REST, and is best described by the Richardson Maturity Model. Tenso will automagically paginate Arrays of results, or parse Entity representations for keys that imply relationships, and create the appropriate Objects in the link Array, as well as the Link HTTP header. Object keys that match this pattern: /_(guid|uuid|id|uri|url)$/ will be considered hypermedia links.

For example, if the key user_id was found, it would be mapped to /users/:id with a link rel of related.

Tenso will bend the rules of REST when using authentication strategies provided by passport.js, or CSRF if is enabled, because they rely on a session. Session storage is in memory, or Redis. You have the option of a stateless or stateful API.

Hypermedia processing of the response body can be disabled as of 10.2.0, by setting req.hypermedia = false and/or req.hypermediaHeader via middleware.

Configuration

This is the default configuration for Tenso, without authentication or SSL. This would be ideal for development, but not production! Enabling SSL is as easy as providing file paths for the two keys.

Everything is optional! You can provide as much, or as little configuration as you like.

{
    auth: {
        delay: 0,
        protect: [],
        unprotect: [],
        basic: {
            enabled: false,
            list: []
        },
        bearer: {
            enabled: false,
            tokens: []
        },
        jwt: {
            enabled: false,
            auth: null,
            audience: EMPTY,
            algorithms: [
                "HS256",
                "HS384",
                "HS512"
            ],
            ignoreExpiration: false,
            issuer: "",
            scheme: "bearer",
            secretOrKey: ""
        },
        msg: {
            login: "POST 'username' & 'password' to authenticate"
        },
        oauth2: {
            enabled: false,
            auth: null,
            auth_url: "",
            token_url: "",
            client_id: "",
            client_secret: ""
        },
        uri: {
            login: "/auth/login",
            logout: "/auth/logout",
            redirect: "/",
            root: "/auth"
        },
        saml: {
            enabled: false,
            auth: null
        }
    },
    autoindex: false,
    cacheSize: 1000,
    cacheTTL: 300000,
    catchAll: true,
    charset: "utf-8",
    corsExpose: "cache-control, content-language, content-type, expires, last-modified, pragma",
    defaultHeaders: {
        "content-type": "application/json; charset=utf-8",
        "vary": "accept, accept-encoding, accept-language, origin"
    },
    digit: 3,
    etags: true,
    exit: [],
    host: "0.0.0.0",
    hypermedia: {
        enabled: true,
        header: true
    },
    index: [],
    initRoutes: {},
    jsonIndent: 0,
    logging: {
        enabled: true,
        format: "%h %l %u %t \"%r\" %>s %b",
        level: "debug",
        stack: true
    },
    maxBytes: 0,
    mimeType: "application/json",
    origins: ["*"],
    pageSize: 5,
    port: 8000,
    prometheus: {
        enabled: false,
        metrics: {
            includeMethod: true,
            includePath: true,
            includeStatusCode: true,
            includeUp: true,
            buckets: [0.001, 0.01, 0.1, 1, 2, 3, 5, 7, 10, 15, 20, 25, 30, 35, 40, 50, 70, 100, 200],
            customLabels: {}
        }
    },
    rate: {
        enabled: false,
        limit: 450,
        message: "Too many requests",
        override: null,
        reset: 900,
        status: 429
    },
    renderHeaders: true,
    time: true,
    security: {
        key: "x-csrf-token",
        secret: "",
        csrf: true,
        csp: null,
        xframe: "",
        p3p: "",
        hsts: null,
        xssProtection: true,
        nosniff: true
    },
    session: {
        cookie: {
            httpOnly: true,
            path: "/",
            sameSite: true,
            secure: "auto"
        },
        name: "tenso.sid",
        proxy: true,
        redis: {
            host: "127.0.0.1",
            port: 6379
        },
        rolling: true,
        resave: true,
        saveUninitialized: true,
        secret: "tensoABC",
        store: "memory"
    },
    silent: false,
    ssl: {
        cert: null,
        key: null,
        pfx: null
    },
    webroot: {
        root: "process.cwd()/www",
        static: "/assets",
        template: "template.html"
    }
}

Authentication

The protect Array is the endpoints that will require authentication. The redirect String is the end point users will be redirected to upon successfully authenticating, the default is /.

Sessions are used for non Basic or Bearer Token authentication, and will have /login, /logout, & custom routes. Redis is supported for session storage.

Multiple authentication strategies can be enabled at once.

Authentication attempts have a random delay to deal with "timing attacks"; always rate limit in production environment!

Basic Auth

{
    "auth": {
        "basic": {
            "enabled": true,
            "list": ["username:password", ...],
        },
        "protect": ["/"]
    }
}

JSON Web Token

JSON Web Token (JWT) authentication is stateless and does not have an entry point. The auth(token, callback) function must verify token.sub, and must execute callback(err, user).

This authentication strategy relies on out-of-band information for the secret, and other optional token attributes.

{
    "auth": {
        "jwt": {
            "enabled": true,
            "auth": function (token, cb) { ... }, /* Authentication handler, to 'find' or 'create' a User */
            "algorithms": [], /* Optional signing algorithms, defaults to ["HS256", "HS384", "HS512"] */
            "audience": "", /* Optional, used to verify `aud` */
            "issuer: "", /* Optional, used to verify `iss` */
            "ignoreExpiration": false, /* Optional, set to `true` to ignore expired tokens */
            "scheme": "Bearer", /* Optional, set to specify the `Authorization` scheme */
            "secretOrKey": ""
        }
        "protect": ["/private"]
    }
}

OAuth2

OAuth2 authentication will create /auth, /auth/oauth2, & /auth/oauth2/callback routes. auth(accessToken, refreshToken, profile, callback) must execute callback(err, user).

{
    "auth": {
        "oauth2": {
            "enabled": true,
            "auth": function ( ... ) { ... }, /* Authentication handler, to 'find' or 'create' a User */
            "auth_url": "", /* Authorization URL */
            "token_url": "", /* Token URL */
            "client_id": "", /* Get this from authorization server */
            "client_secret": "" /* Get this from authorization server */
        },
        "protect": ["/private"]
    }
}

Oauth2 Bearer Token

{
    "auth": {
        "bearer": {
            "enabled": true,
            "tokens": ["abc", ...]
        },
        "protect": ["/"]
    }
}

SAML

SAML authentication will create /auth, /auth/saml, & /auth/saml/callback routes. auth(profile, callback) must execute callback(err, user).

Tenso uses passport-saml, for configuration options please visit it's homepage.

{
    "auth": {
        "saml": {
            "enabled": true,
            ...
        },
        "protect": ["/private"]
    }
}

Sessions

Sessions can use a memory (default) or redis store. Memory will limit your sessions to a single server instance, while redis will allow you to share sessions across a cluster of processes, or machines. To use redis, set the store property to "redis".

If the session secret is not provided, a version 4 UUID will be used.

{
    "session" : {
        cookie: {
            httpOnly: true,
            path: "/",
            sameSite: true,
            secure: false
        },
        name: "tenso.sid",
        proxy: true,
        redis: {
            host: "127.0.0.1",
            port: 6379
        },
        rolling: true,
        resave: true,
        saveUninitialized: true,
        secret: "tensoABC",
        store: "memory"
    }
}

Security

Tenso uses lusca for security as a middleware. Please see it's documentation for how to configure it; each method & argument is a key:value pair for security.

{
    "security": { ... }
}

Rate Limiting

Rate limiting is controlled by configuration, and is disabled by default. Rate limiting is based on token, session, or ip, depending upon authentication method.

Rate limiting can be overridden by providing an override function that takes req & rate, and must return (a modified) rate.

{
    "rate": {
        "enabled": true,
        "limit": 450, /* Maximum requests allowed before `reset` */
        "reset": 900, /* TTL in seconds */
        "status": 429, /* Optional HTTP status */
        "message": "Too many requests",  /* Optional error message */
        "override": function ( req, rate ) { ... } /* Override the default rate limiting */
    }
}

Limiting upload size

A 'max byte' limit can be enforced on all routes that handle PATCH, POST, & PUT requests. The default limit is 20 KB (20480 B).

{
    "maxBytes": 5242880
}

Logging

Standard log levels are supported, and are emitted to stdout & stderr. Stack traces can be enabled.

{
    "logging": {
        "level": "warn",
        "enabled": true,
        "stack": true
    }
}

HTML Renderer

The HTML template can be overridden with a custom HTML document.

Dark mode is supported! The dark class will be added to the body tag if the user's browser is in dark mode.

webroot: {
    root: "full path",
    static: "folder to serve static assets",
    template: "html template"
}

Serving files

Custom file routes can be created like this:

app.files("/folder", "/full/path/to/parent");

EventSource streams

Create & cache an EventSource stream to send messages to a Client. See tiny-eventsource for configuration options:

const streams = new Map();

...

"/stream": (req, res) => {
 const id = req.user.userId;

 if (streams.has(id) === false) {
   streams.set(id, req.server.eventsource({ms: 3e4), "initialized");
 }

 streams.get(id).init(req, res);
}

...

// Send data to Clients
streams.get(id).send({...});

Prometheus

Prometheus metrics can be enabled by setting {prometheus: {enabled: true}}. The metrics will be available at /metrics.

Testing

Tenso has ~80% code coverage with its tests. Test coverage will be added in the future.

-----------|---------|----------|---------|---------|-------------------------------------------------------------------------------------------------------------------------------
File       | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
-----------|---------|----------|---------|---------|-------------------------------------------------------------------------------------------------------------------------------
All files  |   78.15 |    54.93 |   68.75 |   78.58 |                                                                                                                               
 tenso.cjs |   78.15 |    54.93 |   68.75 |   78.58 | ...85,1094,1102,1104,1115-1118,1139,1149-1175,1196-1200,1243-1251,1297-1298,1325-1365,1370,1398-1406,1412-1413,1425,1455-1456 
-----------|---------|----------|---------|---------|-------------------------------------------------------------------------------------------------------------------------------

Benchmark

  1. Clone repository from GitHub.
  2. Install dependencies with npm or yarn.
  3. Execute benchmark script with npm or yarn.

License

Copyright (c) 2024 Jason Mulligan

Licensed under the BSD-3-Clause license.

changelog

Changelog

All notable changes to this project will be documented in this file. Dates are displayed in UTC.

Generated by auto-changelog.

17.2.4

  • Bump rollup from 4.23.0 to 4.24.0 #147
  • Bump rollup from 4.22.5 to 4.23.0 #146
  • Bump rollup from 4.22.4 to 4.22.5 #145
  • Bump eslint from 9.11.0 to 9.11.1 #144
  • Bump rollup from 4.22.2 to 4.22.4 #143
  • Bump rollup from 4.22.0 to 4.22.2 #142
  • Bump eslint from 9.10.0 to 9.11.0 #141
  • Bump nyc from 17.0.0 to 17.1.0 #140
  • Bump rollup from 4.21.3 to 4.22.0 #139
  • Bump concurrently from 9.0.0 to 9.0.1 #137
  • Bump rollup from 4.21.2 to 4.21.3 #136
  • Bump husky from 9.1.5 to 9.1.6 #135
  • Bump concurrently from 8.2.2 to 9.0.0 #134
  • Bump eslint from 9.9.1 to 9.10.0 #133
  • Bump typescript from 5.5.4 to 5.6.2 #132
  • Bump tiny-jsonl from 2.0.3 to 2.0.4 #131
  • Bump tiny-httptest from 4.0.11 to 4.0.13 #130
  • Updating dependencies d884c90

17.2.3

4 September 2024

17.2.2

4 September 2024

  • Bump fast-xml-parser from 4.4.1 to 4.5.0 #129
  • Updating jsonl module c37605e
  • Generated CHANGELOG.md 4af2321

17.2.1

2 September 2024

  • Updating woodland dependency ec0007e

17.2.0

2 September 2024

  • Early exits #128
  • Creating 'exit[]' config array for skipping middleware e5a5b8d
  • Generated CHANGELOG.md db89f71
  • Version bump to release 656757a

17.1.2

2 September 2024

  • Fixing absolute url linking in 'hypermedia()' 90df9ce
  • Generated CHANGELOG.md 025e518
  • Adding missing type files 23a8fa1

17.1.1

2 September 2024

17.1.0

31 August 2024

  • Adding Prometheus exporter #127
  • Bump rollup from 4.21.1 to 4.21.2 #126
  • Adding 'express-prom-bundle' middleware, & creating 'prometheus' to config (WIP) 9c08f5c
  • Fleshing out prometheus integration d080a3c
  • Initiat code to support prometheus (WIP) 7350be8

17.0.4

29 August 2024

17.0.3

29 August 2024

17.0.2

29 August 2024

  • Removing 'keymaster' middleware 08e828f
  • Generated CHANGELOG.md 982c56d

17.0.1

29 August 2024

17.0.0

29 August 2024

  • Rewrite #125
  • Updating html template files & dependendies (WIP) 4a7a8e1
  • Updating dependencies, devDependencies, & scripts in package.json 85a82a4
  • Created more ./src/utils files from ./lib, deleting ./lib (WIP) 7a7f4b9

16.2.4

15 October 2021

  • Late night mistake (forgot about a feature) 50d41df
  • Updating CHANGELOG.md 6eb6c19

16.2.3

15 October 2021

  • Changing session.cookie.secure to "auto" in Tenso class, changing order of middleware for cookies & sessions, updating dependencies 5aa223a
  • Updating http test framework, adding CORS test 9f53973
  • This shouldn't factor into csrf requests for CORS 725cde2

16.2.1

7 October 2021

  • Adding missing call to headers() from onsend handler, updating CHANGELOG.md, version bump to release 8881ce6

16.2.0

7 October 2021

  • Updating CHANGELOG.md d37972f
  • Decorating req.private, updating README.md dcb5c51
  • Updating lock file e4e392e

16.1.0

7 October 2021

  • Setting req.csrf boolean from connect handler which will specify the cache-control header as private 5a98dd7
  • Decorating req.csrf for setting cache-control to private to avoid token reuse bb07790

16.0.15

6 October 2021

  • Updating CHANGELOG.md 0fbbd7d
  • Version bump 'cause fuck npmjs.com cache bugs 5cb62ce

16.0.14

6 October 2021

  • Fixing connect event handler such that csrf is handled correctly for CORS requests, updating dependencies & dev dependencies, version bump to release 1a2162a
  • Updating CHANGELOG.md f7bc677
  • Updating CHANGELOG.md 325c89a

16.0.13

8 September 2021

  • Updating CHANGELOG.md, version bump to release 642618a
  • Returning required function (sigh) 15b2f5b

16.0.12

28 July 2021

  • Updating csv module for nested JSON fields da90aa3

16.0.11

8 February 2021

  • updating renderers to explicity pass the ?lang parameter ac4ba41

16.0.10

6 January 2021

  • Updating Changelog ef7313e
  • Fixing luscaCsrf() callback, creating hasRead() shared function, erasing deprecated jsonWrap() 83cbc0f
  • Fixing benchmark.js for non-Windows environments 3934725

16.0.9

4 January 2021

  • Updating CHANGELOG.md 4d00c88
  • Fixing copy/pasta error on README.md 1df6a6a

16.0.8

4 January 2021

16.0.7

4 January 2021

  • Creating parser() & updating README.md 80868cf
  • Updating CHANGELOG.md 9bdfb94

16.0.6

4 January 2021

  • Updating onsend() override such that it sets res.statusCode() prior to executing serializer fdb5c25
  • Updating CHANGELOG.md 453af4b

16.0.5

4 January 2021

  • Fixing router.onsend() override such that 204/304 responses will not have a response body set from the renderers 37d4452
  • Updating CHANGELOG.md 73e429e

16.0.4

4 January 2021

16.0.3

3 January 2021

  • Moving template.html into www, fixing SCSS/SSC such that the view is in a proper flexbox 2ee0fd0
  • Missed file in last commit 320b89d
  • Updating CHANGELOG.md, updating README.md 302279e

16.0.2

3 January 2021

  • Adding benchmarks & code coverage scripts, updating README.md 4749bcb
  • Updating CHANGELOG.md, removing deprecated ssl/ folder f0e6eff
  • Updating ignore files & removing erroneous files d717943

16.0.1

3 January 2021

16.0.0

3 January 2021

  • Reduced responsibilities #123
  • Updating bulma assets af2fc11
  • Updating Base methods, removing passport middleware, WIP fba307c
  • Initial changes to support new woodland router (no http2 support) - WIP b8c90ce

15.0.15

8 December 2020

  • Version bump to release, updating CHANGELOG.md 6bd3118
  • Reducing utility.sort() & fixing a reference error 7d42d3a

15.0.14

8 December 2020

  • Changing how utility.sort() handles search parameters, fixing utility.sort() such that order_by=desc applies to both cases, updating dependencies 3cfaffc

15.0.13

28 September 2020

  • Updating CHANGELOG.md eadfaa1
  • Rewriting + to %20 for coercion of form encoded request body 833b36a

15.0.12

1 May 2020

  • Bump acorn from 7.1.0 to 7.1.1 #118
  • Fixing link header regression, updating dependencies 3233d4b
  • Updating CHANGELOG.md 70718c7

15.0.11

13 January 2020

  • Updating CHANGELOG.md 2df3fcf
  • Fixing potential reference error in error() which is passed to send() 3bd1398

15.0.10

7 January 2020

15.0.9

2 January 2020

15.0.8

1 January 2020

  • Updating dependencies & year in LICENSE & README ac471aa
  • Removing each() & changing calls to for...of 771d8d5
  • Removing each() from /index.js & /lib/dtrace.js 4bfbf6b

15.0.7

28 November 2019

  • Updating changelog a53c280
  • Updating EventSource dependency for a cache-control header fix for PWAs fa0ca6f

15.0.6

28 November 2019

15.0.5

17 November 2019

  • Updating dependencies to get newer version of tiny-fifo which reverted usage of a Map for the cache (too slow) b1be777

15.0.4

15 November 2019

  • Fixing a flawed default vary header, updating dev dependencies 063b4ba
  • Updating CHANGELOG.md d127a6c

15.0.3

12 November 2019

  • Updating changelog & package.json description 2aa15a1
  • Adding .github to .npmignore 02a2ec8

15.0.2

12 November 2019

  • Updating CHANGELOG.md 499db14
  • Forgot to set use strict in mime() 40d6ab2

15.0.1

11 November 2019

  • Updating CHANGELOG.md bd759a3
  • Fixing logical OR output of mime() 89703be

15.0.0

11 November 2019

  • Using auto-changelog to generate CHANGELOG 3b8e560
  • Redefining behavior of guard() middleware to respond with a 401 when unauthenticated, swapping mimetype for mime-db as source of media types, creating mime() to access media types by filename (path) 96f9d9b
  • Updating CHANGELOG fd349c7

14.0.1

5 November 2019

14.0.0

26 October 2019

  • thanks webstorm... #117
  • Clean up #116
  • Setting headers instead of passing them - part deux 9290e7e
  • Cleaning up renderers & other functions (WIP) 734d866
  • Setting headers instead of passing them 5682a39

13.0.5

24 October 2019

  • Changing how Base is defined f438e52
  • Version bump to release change f1ce841

13.0.4

24 October 2019

13.0.3

24 October 2019

  • Removing an unneeded conditional due to visible > 0 condition in the allowed() method of the router 2c359e1

13.0.2

24 October 2019

  • Updating woodland router b65d45b
  • Reducing keymaster() middleware such that routes which do not terminate will 500 2605ba9
  • Updating CHANGELOG 309fdbc

13.0.1

23 October 2019

  • Updating woodland router, refactoring keymaster() to utilize req.last() ce00d7d
  • Updating CHANGELOG such that it includes merges 5343949
  • Updating woodland router, fixing 206 tests, returning 204 response for OPTIONS requests routing through keymaster() 78828a3

13.0.0

22 October 2019

  • Authentication pipeline refactor #115
  • Removing some closures ed8001d
  • Fixing a middleware order of ops bug that was exposed by changing how the URIs were tested to align with the router update ef47050
  • Updating router, exposing issues with current auth pipeline 2f99d0a

12.1.0

19 October 2019

  • Create FUNDING.yml #114
  • Creating changelog npm script & CHANGELOG output f9e4080
  • Creating auth.delay: 0 config value to afford random timing of authorization validation on protected routes fc495a4

12.0.9

2 October 2019

  • Fixing a regex bug in keymaster() middleware, updating dependencies, removing 'watch' grunt module & task d2d51e9

12.0.8

19 September 2019

  • Fixing a regression in hypermedia() regarding pagination - returning original or for NaN outputs of Number() bb2d327

12.0.7

19 September 2019

  • Fixing a bug in hypermedia() regarding pagination 8bab09c

12.0.6

19 September 2019

  • Fixing a bug in hypermedia() regarding pagination e9a7e33

12.0.5

5 September 2019

  • Updating router to get a faux CORS regression 3b586bb

12.0.4

5 September 2019

  • Removing an unneeded try/catch in error() & removing bind of it (irrelevant scope) 1eba366
  • Adjusting assignments in send() 304f584
  • Fixing regression of how an unserialized null is handled within send() 84b9f1b

12.0.1

4 September 2019

  • Fixing handling of redirects, updating test framework 1f8c0c0

12.0.0

3 September 2019

  • Multimap #113
  • Bump eslint-utils from 1.4.0 to 1.4.2 #112
  • Adding new lock file 7b5bc6b
  • Updating dependencies, initial refactoring to new woodland 3580d96
  • Refactoring connect() to create a facade of res.send() such that the code is clearer 451593e

11.4.0

10 August 2019

  • Updating woodland router to fix performance regression ca53c92

11.3.1

10 August 2019

11.3.0

10 August 2019

  • Upgrading woodland router, disabling failing test (why is it timing out?) 3b6a372
  • Upgrading woodland router & re-enabling test that was failing due to http1 piping, exposes flaw in local auth & etag handling d609b6f
  • Updating woodland router da692d1

11.2.2

7 August 2019

  • Bump lodash from 4.17.11 to 4.17.14 #111
  • Updating dependencies 1de5ea2

11.2.1

8 June 2019

  • Fixing attempting to cast undefined & null within hypermedia.marshal(), fixes #110 #110

11.2.0

4 June 2019

  • Creating corsExpose string in config for appending to end of access-control-expose-headers, adding CSRF token name to access-control-expose-headers ce3b14b

11.1.3

27 May 2019

  • Fixing a regression for node.js 8 & 9, updating travis-ci.org configuration ac2efbb

11.1.2

27 May 2019

  • Fixing jsonWrap(), fixing hypdermedia() handling of query string parameters for generating links, fixes #109 #109

11.1.1

24 April 2019

  • Changing final to be an async function for real world usage eaac296

11.1.0

24 April 2019

  • Fixing a regression in middleware via the wrong method on a string variable; creating this.final(req, res, body) which can be used to modify the response body output of this.hypermedia() 9f89ed3

11.0.3

22 April 2019

  • Removing unneeded variables 2ef238f
  • Removing unneeded variables 556fb01

11.0.2

20 April 2019

  • Fixing how a string comparison is made within hypermedia() 133fe1d

11.0.1

20 April 2019

11.0.0

20 April 2019

  • Fixing auth regex generated for paths bd0a25b
  • Fixing how config.auth.protect regex get generated such that paths must be an explicit match or a child of a protected route (sub dir); can impact existing configurations by changing/removing the need for /unprotect in some cases 5e973b7

10.5.0

7 March 2019

  • Upgrading router to get list of approved origins for CORS requests & adding origins = ["*"] configuration option, updating README 9852330

10.4.5

28 February 2019

  • Fixing utility.hypermedia() such that it calls the correct method when constructing Links, changing dtrace.sh to `+x f035d93

10.4.4

28 February 2019

  • Fixing DTrace probe instantiation such that it happens within start() 2eddc3c

10.4.3

28 February 2019

  • Version bump to release fix ea9afb3
  • Fixing bearer token auth lookup such that changes in time are reflected here d6c2568

10.4.2

27 February 2019

  • Fixing retry-after header decoration 80bac0c

10.4.1

26 February 2019

  • Adding DTrace probes, updating router 9b4b6c6
  • Including dtrace.sh for local dev, swapping forEach() with each() 5009846
  • Forgot to add the Map b3782c7

10.4.0

19 February 2019

  • Upgrading router to get dtrace probes; probably going to add probes in tenso for end to end insight f5b0705

10.3.3

17 February 2019

10.3.2

17 February 2019

  • Decorating a retry-after header for clients 26c39a5
  • Version bump d54ec04

10.3.1

17 February 2019

  • Changing always middleware to require to be a function to register on start() a15f004

10.3.0

17 February 2019

  • Refactoring to run custom always middleware before authorization middleware runs, as an early exit 484a859

10.2.8

29 January 2019

  • Changing what's imported from utility 8fcd718
  • Fixing payload middleware by passing through multipart requests 190e0d7

10.2.7

28 January 2019

  • Updating render() to assign accepts such that it is equal to serializer() 1fb4678

10.2.6

28 January 2019

  • Fixing a memoization error if the request is a HEAD 15e1da9

10.2.5

28 January 2019

  • Changing how URIs are handled within hypermedia(); can be refactored to be better, fixes #108 #108

10.2.4

27 January 2019

  • Refactoring utility.serialize() such that the forth parameter can override explicit client format requests 942cc97

10.2.3

27 January 2019

  • Refactoring utility.serialize() to accept a forth parameter to help determine the appropriate media type response format f5cf141
  • Updating moment 0f4386c

10.2.2

26 January 2019

  • Upgrading etag middleware & router 10c0c92
  • Removing a debugging attribute 5d9abcb
  • Removing a debugging attribute 7e231b1

10.2.1

22 January 2019

  • Fixing pagination regression with utility.hypermedia() (oops) 9f93a6c

10.2.0

21 January 2019

  • Removing regex.scheme & replacing with scheme(), removing each() from Base file, creating req.hypermedia [true] & refactoring hypermedia() to conditionally process the response body such that a generic route can be ignored for Array indices 7d8b19a

10.1.4

14 January 2019

  • Updating ETag middleware & router c8c1a24

10.1.3

14 January 2019

10.1.2

14 January 2019

10.1.1

13 January 2019

10.1.0

13 January 2019

  • Exposing renderers & serializers on instances, updating README fabcbc7

10.0.36

13 January 2019

  • Undoing change to id detection due to lack of major bump cce5bea

10.0.35

13 January 2019

  • Removing regex.id which changes hypermedia ID linking (not considering major change because DB models default to lower case) d67dfbe

10.0.34

13 January 2019

  • Minimizing ops in isEmpty() ee47a57

10.0.33

13 January 2019

10.0.32

13 January 2019

  • Updating etag middleware & router b5be4fc

10.0.31

13 January 2019

  • Updating etag middleware & router, removing unneeded ops from conditional statements 82698dc

10.0.30

13 January 2019

  • Updating etag middleware & router 4ed5f8f

10.0.29

12 January 2019

10.0.28

11 January 2019

  • Fixing a regression in the factory, updating copyright b945dbb

10.0.27

8 January 2019

  • Replacing a global regex replace with an Array.reduce() c841e1c

10.0.26

8 January 2019

10.0.25

6 January 2019

  • Removing some RegExp & creating shared functions, updating router to get a fix affecting reference errors within the error code path for 500s, fixes #99 #99

10.0.24

4 January 2019

10.0.23

4 January 2019

  • Fixing erroneous usage of fs.lstat() b02181b

10.0.22

4 January 2019

10.0.21

4 January 2019

10.0.20

4 January 2019

10.0.19

3 January 2019

  • Changing payload middleware to deal with aggressive streams 744350f

10.0.18

3 January 2019

10.0.17

3 January 2019

10.0.16

3 January 2019

  • Returning config.index[], updating tests to verify redirect & HTML response from /sample, fixing sending files via HTTP2, exposing a flaw in HTTP2 code path, fixes #107 #107
  • Fixing new HTTP2 tests 776d366
  • Updating npm ignore file c7ce3e8
  • Updating npm ignore file 37aeb2b

10.0.15

30 December 2018

10.0.14

19 December 2018

  • Updating etag middleware & router 7e13b00

10.0.13

19 December 2018

  • Fixing assignment of config.root within factory 8c321aa

10.0.12

18 December 2018

  • Updating EventSource module 2acb6bb

10.0.11

17 December 2018

  • Removing hard coded path from file() middleware, fixes #106 #106

10.0.10

17 December 2018

  • Removing external URIs from links due to header value size issues when dealing with large collections which link to many URIs; sample from work project had a 46 KB Link header 28d0017
  • Undoing recent change to tests bed521f

10.0.9

17 December 2018

  • Formatting tests e9e157f
  • Upgrading EventSource module 39e08e5
  • Decoding order_by query string value before passing to keysort() 40b2134

10.0.7

16 December 2018

  • Removing permission check on URIs with schemes due to implied external nature & updating tests, fixes #105 #105

10.0.6

15 December 2018

  • Updating EventSource module 2fe65e0

10.0.5

13 December 2018

10.0.4

12 December 2018

  • Updating etag middleware & router 2e552e8

10.0.3

12 December 2018

  • Updating etag middleware & router 4e13276

10.0.2

12 December 2018

  • Updating etag middleware & router 318bbf8

10.0.1

11 December 2018

  • Memoizing route within keymaster() f563f16
  • Changing keymaster() to not call allowed() and use req.allow instead 0476c9b
  • Removing the call() within keymaster() 07fcf8b

10.0.0

9 December 2018

  • Updating ETag middleware & router, updating README edad27a

9.1.25

8 December 2018

  • Updating ETag middleware & router a5994c8

9.1.24

7 December 2018

  • Updating ETag middleware & router 06cf4af

9.1.23

5 December 2018

  • Updating ETag middleware & router 02ba8f9

9.1.22

5 December 2018

  • Updating ETag middleware & router 6485812

9.1.21

5 December 2018

  • Updating change to hypermedia() such that URIs are consistent b5a541c

9.1.20

5 December 2018

  • Updating hypermedia() to replace spaces with %20 on link URIs 9e67d06

9.1.19

5 December 2018

  • Updating ETag middleware & router 3378401

9.1.18

5 December 2018

  • Updating ETag middleware & router 019e98a

9.1.17

5 December 2018

  • Updating ETag middleware & router 0e42958

9.1.16

5 December 2018

  • Updating ETag middleware & router cae4ab8

9.1.15

5 December 2018

9.1.14

5 December 2018

  • Minor tweaks to error(), updating lock file c5d68d5

9.1.13

4 December 2018

  • Putting a try/catch around res.send() within error() to handle a GC'd req 4295c38
  • Changing connect() such that it doesn't decorate res.send(), removing the bind on error() for the router method 379f081

9.1.11

30 November 2018

  • Updating router & etag middleware ae34bf2

9.1.10

28 November 2018

  • Updating function signatures 456310f

9.1.9

28 November 2018

  • Refactoring bypass() middleware to fix a CORS regression for bypassing auth middleware 5826cdb

9.1.8

28 November 2018

  • Updating EventSource dependency dc01222

9.1.7

28 November 2018

  • Updating EventSource depedency 0696509

9.1.6

27 November 2018

  • Updating router & etag middlware bc925e2

9.1.5

26 November 2018

  • Updating router & eta middlware 675770b

9.1.4

24 November 2018

  • Updating router & etag middleware 479cf75

9.1.3

20 November 2018

  • Updating router & etag middleware 369754d

9.1.2

20 November 2018

  • Updating router & etag middleware 68530fe

9.1.1

20 November 2018

  • Updating router & etag middleware 26babfc

9.1.0

20 November 2018

  • Creating eventsource() 22a94bf
  • Separating eventsource() into separate module 43ce800
  • Changing the signature of EventSource 37143d0

9.0.8

12 November 2018

9.0.7

7 November 2018

  • Removing maxAge value specified on cookies (erroneous approach) 9277946

9.0.6

7 November 2018

  • Fixing express-session config (looks like I was distracted; half done) bc71b6c

9.0.5

1 November 2018

  • Fixing stop() by removing a deprecated statement e05c684

9.0.4

29 October 2018

  • Making etag() a little more robust (aka slow) c7973d1

9.0.3

28 October 2018

  • Upgrading etag middleware df02856

9.0.2

23 October 2018

9.0.1

23 October 2018

9.0.0

23 October 2018

  • Dropping uws & coap dependencies, updating README, updating package.json description e8f3825

8.2.0

23 October 2018

  • API flex #104
  • Updating woodland router, initial refactor to support new API 024e21e
  • Updating woodland router, fixing a reference error in guard() middleware 7bf85cd
  • Version typo lol 50e0dde

8.1.4

23 October 2018

8.1.3

23 October 2018

8.1.2

22 October 2018

  • Adding yargs for command line properties, embedded JSON is supported 4ad1d88
  • Version bump to release 5a2aadb

8.1.1

22 October 2018

  • Upgrading woodland router f7d4bd9

8.1.0

16 October 2018

  • Creating config.logging.stackWire for separating logging a stack from transmitting a stack over the wire ec9e0aa

8.0.36

15 October 2018

  • Removing transpiled & minified router 7004e3a
  • Fixing a conditional statement within static(), fixing text/plain renderer 9a30d4b
  • Removing an assignment because it'd be inlined c4cc833

8.0.35

14 October 2018

  • Simplifying statik() middleware 6cc94c5
  • Simplifying the text/html renderer when the template is empty, updating middleware export syntax, updating /uuid headers 0611727

8.0.34

30 August 2018

8.0.33

30 August 2018

  • Changing the default content-type response header to be text/plain to reflect the default string output 9a8743f

8.0.32

30 August 2018

  • Fixing a regression in zuul such that unprotect overrides protect by config e37cf36

8.0.31

29 August 2018

  • Upgrading router dependency b07871a

8.0.30

28 August 2018

  • Upgrading CSV dependency to get a fix 09c4af3

8.0.29

28 August 2018

  • Upgrading woodland router to get a Promise chain fix 0f7b97a

8.0.28

27 August 2018

  • Upgrading csv.js dependency to get a fix for empty arrays within a text/csv response 626c482

8.0.27

27 August 2018

  • Fixing CSV renderer such that it passes an Array or Object to csv.encode() because a string itself cannot be encoded to CSV cf7c6f8

8.0.26

26 August 2018

  • Updating csv dependency to get a fix 1935389

8.0.25

26 August 2018

8.0.24

26 August 2018

  • Fixing a lint error due to diff project rules & IDE bug e5c926b

8.0.23

26 August 2018

8.0.22

26 August 2018

  • Minor tweak of uws version 41d51ed

8.0.21

26 August 2018

  • Downgrading uws to a version that works bc1b0ed
  • Version bump afd57e6

8.0.20

26 August 2018

  • Adding missing default serializers to match with existing renderers & fixing bugs exposed by adding them ceccfde
  • Reducing a comparison d3b88bf
  • Removing an unneeded op within hypermedia() a9e0ae9

8.0.19

19 August 2018

8.0.18

18 August 2018

  • Fixing regex.hypermedia & regex.id f893987
  • 1 lining the new serializer b744027
  • Fixing CSV output by specifying a default serializer e953f83

8.0.17

29 July 2018

  • Updating etag middleware, updating LICENSE & README years d69440c

8.0.16

25 July 2018

  • Removing unneeded regex, making some regex case insensitive a20552f
  • Upgrading http test module 8efdb68

8.0.15

25 July 2018

8.0.14

24 July 2018

  • Backfilling valid OPTIONS requests without an explicit route handler 6d55324
  • Making some conditionals explicit ae8b0e5
  • Removing unneeded string ops in reduce() 9cd10ad

8.0.13

24 July 2018

  • Fixing OPTIONS route handling, removing an unneeded closure, upgrading router 5da89ae

8.0.12

22 July 2018

  • Changing this.rates to be a Map to avoid megamorphic issues 4eca313

8.0.11

18 July 2018

  • Updating woodland router, changing onsend() handler to be async (WIP for compression) 585da59

8.0.10

11 July 2018

  • Moving each() into shared.js to avoid a circular dependency, fixing logging such that the query string is present c1e3334

8.0.9

11 July 2018

  • Overriding res.json() from connect() such that the tenso code path is utilized b091621

8.0.8

11 July 2018

  • Fixing file() middleware such that it throws a useful error 2a9e5b1

8.0.7

11 July 2018

  • Upgrading router to get a fix for res.error() dc39e43

8.0.6

10 July 2018

  • Deployment regression due to auth change 49a7529

8.0.5

10 July 2018

  • Fixing a middleware regression due to refactoring 606707f

8.0.4

10 July 2018

  • Upgrading ETag middleware 3871938

8.0.3

10 July 2018

  • Removing an old bit of logic that was a stop gap for an earlier bug; you can now specify OPTIONS responses for proper API KT over the wire (that's the point of OPTIONS btw...) 98fabf0

8.0.2

9 July 2018

  • Minimizing relying on the router for error termination 41e4486
  • Removing unneeded ops & decoration 44b93f1
  • Minimizing relying on the router for error termination 5ab2122

8.0.1

9 July 2018

  • oops! deployment regression 7ea4473

8.0.0

9 July 2018

  • Rewrite with HTTP2 fully baked #100
  • Changing the shape of Tenso & moving things to utility & removing middleware (WIP), upgrading router 81bee02
  • Rearranging config properties & utilizing where appropriate e8f9ba4
  • WIP / debugging 1326fcc

7.0.14

13 June 2018

7.0.13

7 June 2018

  • Updating router, changing default address to 0.0.0.0 so vm installs are less annoying 39484d2

7.0.12

5 June 2018

7.0.11

4 June 2018

  • Removing more headers from redirect responses, fixing a test 7ec67d9

7.0.10

4 June 2018

  • Deleting cache-control header on redirect responses, removing grunt-nsp module due to audit warnings from npm e97e7dc

7.0.9

25 May 2018

  • Removing an erroneous parameter left behind in the last change a90bd50

7.0.8

24 May 2018

7.0.7

23 May 2018

7.0.6

23 May 2018

7.0.5

23 May 2018

  • Updating ETag middleware & router 3f960dc

7.0.4

18 May 2018

  • Micro optimization in rate limiting ce5860b

7.0.3

16 May 2018

7.0.2

3 May 2018

7.0.1

23 April 2018

7.0.0

4 April 2018

  • Upgrading the router & removing try/catch for automatic error handling within routes 89d398b

6.4.5

28 March 2018

  • Destroying the session on static assets (implied caching) 6912d1b

6.4.4

28 March 2018

  • Removing cookie header on static assets to raise chance of nginx cache ab0f254

6.4.3

27 March 2018

  • Removing an erroneous header stripping 687968b

6.4.2

26 March 2018

  • Version bump to release the fix 24b3ee8
  • Fixing the decorated res.redirect() such that the parameters are in sync with the signature on tenso a669d83

6.4.1

25 March 2018

  • Updating dependencies to get an LRU fix 2631866

6.4.0

24 March 2018

  • Changing default headers such that assumptions are not made, specifying a TTL on Etags a0fd62f

6.3.8

22 March 2018

6.3.7

22 March 2018

  • Updating woodland router, fixes #98 #98
  • Revert "Updating dependencies" 6453e93
  • Updating dependencies 8ddd7b9
  • Revert "Will it blend, i mean break?" 6f9993e

6.3.6

7 March 2018

  • Updating woodland router for a fix to route parameters 2530b56
  • Updating dependencies 3b24625
  • Updating failing http2 auth tests bc175b7

6.3.5

16 January 2018

6.3.4

16 January 2018

6.3.3

16 January 2018

  • Updating router and creating HTTP2 tests (disabled) 60e48c4
  • Updating router, enabling some HTTP2 tests 1c5a617
  • Disabling all HTTP2 tests except 'auth' for debugging eec5e7c

6.3.2

1 January 2018

  • Fixing a typo in the csrf wrapper within utility.auth() b39ee8e

6.3.1

1 January 2018

  • Changing the default serializer to support {data:null, error:null} responses when a valid API request results in a null response ad7e05f

6.3.0

28 December 2017

  • Updating LRU & router, adding cacheTTL configuration option for etag & routes caches, changing assignment of obj.etags.cache.update to rely on typeof x === "function" evaluating as true 28c35e3

6.2.11

23 December 2017

6.2.10

22 December 2017

  • Fixing the output of utility.explode() 0cab749
  • Updating lock file 0a4c941

6.2.9

22 December 2017

6.2.8

20 December 2017

6.2.7

20 December 2017

6.2.6

20 December 2017

6.2.5

16 December 2017

  • Refactoring errHandler() to be in lexical scope with new arity as utility.error() 1231898
  • Reducing arity of utility.error() 6bdc75a

6.2.4

11 December 2017

  • Updating csv & websocket modules d6a6d0a

6.2.3

5 December 2017

  • Fixing passing undefined as arg to respond() 72240d3

6.2.2

4 December 2017

  • Forgot to return from res.send()!! & changing the conditional statement to be a little more correct d8f5b19

6.2.1

4 December 2017

  • Version bump to re-release because npm is being weird 20aa002

6.2.0

4 December 2017

  • Refactoring res.send() to accept body or status first fcf15af

6.1.5

4 December 2017

  • Refactoring hypermedia() to not blow up if rep.links doesn't exist 83a9230

6.1.4

4 December 2017

  • Patching res.json() to hook respond() e79ebc9

6.1.3

4 December 2017

  • Refactoring keymaster() middleware to use the router Map instead of config such that all middleware is accounted for, updating woodland for no good reason 1b2a24c

6.1.2

3 December 2017

  • Updating retsu, tiny-etag, & woodland 53d2f7d

6.1.1

1 December 2017

  • Extending new HTTPMethods class to inherit a clean set of http methods 561a7ae

6.1.0

30 November 2017

  • Upgrading woodland router for res.json() & res.status() for middleware interop d18b1c3

6.0.8

28 November 2017

  • Version bump to release new router 82118d0

6.0.7

28 November 2017

  • Upgrading woodland router to get a fix on res.send(), disabling nsp task in grunt test due to an out dated dep within the chain which I have no control over 1dfb7d1

6.0.6

24 November 2017

  • Manually changing the browsable app 287760d
  • Minor tweak e5bc862
  • Version bump to release fix for browsable interface f05fc2f

6.0.5

24 November 2017

  • Fixing a regression on the HTML renderer for sending a request via the browsable interface ed7eea4

6.0.4

24 November 2017

  • Adding sample http2 server 9236c3d
  • Working out some of the HTTP2 issues (file streams are non-functional atm) 486412d
  • Working out kinks of serving files from disk 3764560

6.0.3

23 November 2017

  • kinda need this lol pt deux, sorting keys in config.json 9851956

6.0.2

23 November 2017

6.0.1

23 November 2017

  • Updating router to get a logging fix for http2 611b26f

6.0.0

23 November 2017

  • Updating router, major version bump for new engine requirement e891b73

5.2.14

23 November 2017

5.2.13

23 November 2017

5.2.12

22 November 2017

  • Removing a conditional statement within bypass() middleware, updating router 257ffef

5.2.11

13 November 2017

  • Updating ETag middleware & router (underlying LRU cache updated) 2acd048

5.2.10

8 November 2017

  • Fixing a deopt due to reassigning with send() on first error which mutates headers, updating dependencies 230e05c
  • Updating travis-ci.org configuration 2a75fcf

5.2.9

6 November 2017

  • Reflect.ownKeys() to Object.keys() because it doesn't need symbols included, updating dependencies 7ecd5ca

5.2.8

2 November 2017

5.2.7

1 November 2017

  • Linting all root javascript files 72d9290
  • Minor change to hypermedia() cfa4b60
  • Updating grunt watch task f58cbbc

5.2.6

31 October 2017

  • Removing local cached references 497f8f0

5.2.5

20 October 2017

5.2.4

18 October 2017

  • Adding forth parameter to JSON serialization such that an Error stack could be echoed to the end user 4220ee5

5.2.3

18 October 2017

5.2.2

12 October 2017

  • Updating router 76cba08
  • Updating router, fixing #94, adding a test (likely should be in tiny-httptest) 95d0b87

5.2.1

8 October 2017

  • Final removal iterate() from utility module 453af6d
  • Removing iterate() from middleware module 9886881
  • Removing iterate() from Tenso class 4167f58

5.2.0

2 October 2017

  • Adding coerce: true to the config, updating dependencies 6720b42
  • Updating dependencies, fixing LICENSE content, updating README 2b9178d

5.1.21

25 September 2017

  • Removing unused utility functions & changing export, swapping let for const where possible, updating dependencies ffa42bc

5.1.20

19 September 2017

  • Fixing a regression in the HTML renderer for 404 responses, fixes #93, adding error tests for all renderers #93

5.1.19

18 September 2017

  • Updating csv.js dependency 429fa87

5.1.18

11 September 2017

  • Replacing custom Array of HTTP methods with http.METHODS in all() method ce4478b
  • Changing an instanceof Array to Array.isArray() 606b888

5.1.17

11 September 2017

  • Version bump & new lock file 4c9a68d
  • Adding a text/plain renderer 9a818b1
  • Removing straggler logical NOT operators d9be23f

5.1.16

6 September 2017

  • Updating router to get new url parsing 90d4c7f

5.1.15

5 September 2017

  • Switching from deprecated new Buffer() to Buffer.from(), fixes #92, changing a res.setHeader() to res.header()for consistent short-hand, removing reference tores._headersviares.getHeaders()[#92`](https://github.com/avoidwork/tenso/issues/92)

5.1.14

5 September 2017

  • Updating woodland router, removing String.raw for literal template strings bc471a8
  • moar changes a365607
  • Removing truthy / falsy statements 7683a40

5.1.13

3 September 2017

  • Hiding headers behind a preference, fixes #85 #85

5.1.12

19 August 2017

  • Updating stream() middleware to pass an Error ddb7ff6

5.1.11

19 August 2017

  • Fixing error passing within static(), fixes #90 #90

5.1.10

18 August 2017

  • Revert "Testing a new slack module for more flexible scopes" 6d33353
  • Version bump for reverts ef0caa8
  • Revert "Removing deprecated property from the configuration file" 1b35756

5.1.9

18 August 2017

  • Testing a new slack module for more flexible scopes edd516a

5.1.8

18 August 2017

  • Exposing skipUserProfile configuration option of Slack passport middleware 43c3d04

5.1.7

18 August 2017

  • Adding auth.slack.scope to configuration for scope grant specification of Slack auth strategy b10cdac

5.1.6

18 August 2017

  • Revert "Fixing auth route handling in keymaster() by decorating routes in config of server, fixes #88, updating router" #88
  • Undo! a0db2d2

5.1.5

18 August 2017

  • Fixing auth route handling in keymaster() by decorating routes in config of server, fixes #89, updating router #89

5.1.4

17 August 2017

  • Exposing middleware.static() as tenso.static() for easy static route definition 59fc659

5.1.3

17 August 2017

  • Fixing an HTML renderer regression due to a change to use a literal template to generate a RegExp, updating test with realistic accept header value 42626a0

5.1.2

17 August 2017

  • Switching to String.raw() template literals c319c7f

5.1.1

17 August 2017

  • Removing unused middleware.noop(), version bump 26d61e5
  • Updating README e686d12

5.1.0

17 August 2017

  • Adding passport-slack strategy #88
  • Initial commit with passport-slack module added, updated config e9c93ff
  • Changing truthy to explicit comparisons 04b2ca6
  • Wiring passport-slack into utility.auth() 520b684

5.0.6

14 August 2017

  • oops, fixing a logging regression e99f27a

5.0.5

14 August 2017

5.0.4

30 July 2017

  • Fixing coap initialization, fixing websocket handling for significantly newer uws library 2c16ab6
  • Updating ETag middleware 5f3ac0d

5.0.3

30 July 2017

  • Updating web socket server bb6c02f

5.0.2

29 July 2017

  • Removing unneeded regex keys, removing truthy statements 9f76f57

5.0.1

28 July 2017

  • Fixing csv downloads by correcting the content-disposition header (a few cases), removing utility.merge() because just routes back to tiny-merge & is now used much, adding more assertions to text/csv tests f32323c
  • Removing an unneeded file 3bee6e9

5.0.0

26 July 2017

4.5.25

29 June 2017

  • Removing a truthy, moving RegExp into regex ed335f4
  • 1 lining a statement 7b665ac
  • Updating README 1032376

4.5.24

17 June 2017

  • Simplifying sanitize() within the renderers d958f4c

4.5.23

16 June 2017

  • oops! should've used sanitize() last commit, one lining c5bd840

4.5.22

15 June 2017

  • Escaping < & > for HTML renderer, fixes #84 #84
  • Adding a package-lock.json file for npm@5 91b1c2f

4.5.21

29 May 2017

  • Creating delay() & random() utility functions to randomly delay authentication, fixes #83 #83
  • Updating auth() signature 488eb24

4.5.20

28 May 2017

  • Changing undefined to void 0, updating server d1d7ed0

4.5.19

28 May 2017

4.5.17

28 May 2017

  • Removing truthy/falsy statements, upgrading server fb08ab4

4.5.16

28 May 2017

  • Upgrading turtle.io server to fix an error in the router 659c9bb

4.5.15

28 May 2017

  • Upgrading turtle.io server 5514091

4.5.14

27 May 2017

  • Upgrading turtle.io, connect-redis, express-session, uws & tiny-httptest 9e94c9a

4.5.13

27 May 2017

  • Updating server d62b0cc
  • Minor optimization of valid() middleware 48c9289

4.5.12

27 May 2017

4.5.11

24 May 2017

4.5.10

24 May 2017

4.5.9

22 May 2017

  • Sanitizing the innerHTML value that will be set from the API response 677d8b1

4.5.8

22 May 2017

  • Fixing JSON transmission from the browsable interface 840cb2f

4.5.7

22 May 2017

4.5.6

22 May 2017

  • Removing requirement of the request body to have a value before submitting ebbbbf0

4.5.5

21 May 2017

  • Fix session #81
  • Configuring session cookie better 0f4fe06
  • Updating Session portion of README d42d7b6
  • Turning off secure feature of cookie since it requires HTTPS for round trips and that's not a fantastic default for load balanced applications 83ea916

4.5.4

19 May 2017

  • Fixing a reference error for non-JSON responses in the browsable interface fce665d

4.5.3

18 May 2017

4.5.2

18 May 2017

4.5.1

18 May 2017

  • Adding a cache-control header with the value of public, max-age=n for static assets served for browsable interface, upgrades server c734f27

4.5.0

18 May 2017

4.4.2

17 May 2017

  • Changing body parser slightly to do form encoding or json parsing, updating regex. json_wrap 46a0ff9
  • Updating CORS test for new server 6df9c74
  • Updating the server 3c6bd95

4.4.1

14 May 2017

4.4.0

14 May 2017

  • Partial implementation of order_by query string parameter which supports SQL ORDER BY syntax (key [asc|desc], ...), partially fixes #78 #78
  • Fixing sorting of primitives, adding tests c0ea846
  • Adding a test for sorting Objects 28cafe2
  • Refactoring sort() to support Arrays of primitives c961af5

4.3.36

13 May 2017

4.3.35

13 May 2017

  • Updating server & yaml module 06481e8

4.3.34

12 April 2017

  • Updating server, coap, session, & yaml dependencies cf37f18

4.3.33

30 March 2017

4.3.32

22 March 2017

  • Updating server & test framework, updating .npmignore 95cb2cc
  • Fixing some declarations, updating dependencies 646a680

4.3.31

21 March 2017

  • Fixing some declarations, updating dependencies e705c1e

4.3.30

20 February 2017

  • Changing HTTP test frameworks & updating tests, updating sample bf99406
  • Adding a CORS test 46351cb

4.3.29

15 February 2017

4.3.28

13 February 2017

  • Updating server for a CORS header fix d8c17c7

4.3.27

12 February 2017

  • Updating server for a logging fix 0908462

4.3.26

10 February 2017

4.3.25

9 February 2017

  • Changing x instanceof Array to Array.isArray(x), updating dependencies 672ef88

4.3.24

7 February 2017

  • Didn't mean to change that 53a3b74

4.3.23

7 February 2017

  • Fixing x-xss-protection header decoration, adding support for nosniff configuration flag for lusca, fixes #75 #75

4.3.22

7 February 2017

  • Fixing rate() middleware, fixes #76 #76

4.3.21

7 February 2017

  • Rushed the header rewrite a little cdc4bf7

4.3.20

6 February 2017

  • Handling cache-control header rewrite better 9794b25

4.3.19

6 February 2017

  • Another change to respond() regarding header decoration for ETag generation 0e660d1

4.3.18

6 February 2017

  • Refactoring respond() to pass headers to canETag() & re-ordering some ops 10d8443

4.3.17

6 February 2017

4.3.16

5 February 2017

  • Fixing CORS responses for browsers 46abbb1

4.3.15

5 February 2017

  • Fixing CORS responses for browsers 6c0445d

4.3.14

5 February 2017

  • Fixing CORS responses for browsers b2d2cee

4.3.13

5 February 2017

  • Short circuiting OPTIONS requests to bypass authentication/authorization pipeline for CORS requests 778572a

4.3.12

5 February 2017

  • Updating server to get a CORS fix 41f63e0

4.3.11

5 February 2017

  • Updating server to get a CORS fix 62a7c82

4.3.10

30 January 2017

4.3.9

23 January 2017

4.3.8

23 January 2017

  • Fixing config on start up, fixes #73 #73

4.3.7

6 January 2017

  • Updating turtle.io server 7095e43

4.3.6

5 January 2017

  • Updating turtle.io server a7b93b8

4.3.5

2 January 2017

  • Updating turtle.io server faa0f17

4.3.4

2 January 2017

  • Respecting link header passed to hypermedia() 9029ce9

4.3.3

2 January 2017

  • Updating turtle.io dependency 35fa9da

4.3.2

2 January 2017

  • Refactoring to use iterate() instead of calling array.each() directly, changing Object.keys() to Reflect.ownKeys() 5863595
  • Updating turtle.io server & iterate() signature 623a994
  • Adding strict mode declaration to each module d5238d7

4.3.1

1 January 2017

  • Streamlining an assignment in middleware.js, updating README with a link to the sample application in github 39f6886

4.3.0

28 December 2016

  • Changing default JSON output to have no padding, moving regex.id & regex.hypermedia definitions into config.json & allowing for overriding of any default from there fe87c72

4.2.0

21 December 2016

  • Adding JWT strategy #71
  • Updating sample for test purposes 2cf1041
  • Adding JWT tests 5d66a2b
  • Unsetting default value of version, changing occurrences of "all" to const all e4be1b0

4.1.9

27 November 2016

  • Switching Array.forEach() with array.each() 8931d88

4.1.8

27 November 2016

4.1.7

27 November 2016

  • Updating respond() to include the URL in the ETag creation to avoid collisions of the same output across different URLs 3d5fe8f

4.1.6

27 November 2016

  • Adding etags.ignore to config for conditionally blocking ETag header creation on GET requests cbb5887

4.1.5

27 November 2016

  • Upgrading turtle.io to get access to ignoring paths for ETag creation 571a0fa

4.1.4

27 November 2016

  • Updating html renderer, fixes #69 #69

4.1.3

23 November 2016

  • Fixing server header value aa56b89

4.1.2

20 November 2016

4.1.1

19 November 2016

  • Updating turtle.io to get full cache propagation db2f1ad

4.1.0

19 November 2016

  • Upgrading turtle.io to 7.2.0 to gain cache notification/propagation, fixes #68 #68

4.0.6

19 November 2016

  • Fixing hypermedia() cc77fae
  • Updating travis-ci.org config 36ffb7c
  • Updating travis-ci.org config 2f1cbe7

4.0.5

19 November 2016

  • Updating turtle.io, syntax & eslint rules 0f4ade4
  • Update README.md d56c41f

4.0.4

30 July 2016

  • Correcting the default value for the HSTS max-age 047796a

4.0.3

8 July 2016

  • Updating server to get a CORS fix ce62f96

4.0.2

7 July 2016

  • Adding support for route parameters, updating test syntax, fixes #65 #65
  • Updating test with a parameter route 842c05e
  • Updating server 2af54a4

4.0.1

7 July 2016

  • Woodland #64
  • Updating server to get a logging fix 403b33d

4.0.0

6 July 2016

  • Getting it mostly working with a woodland powered turtle.io (WIP) 5b1e958
  • Updating eslint config, getting another test passing, lint changes 4ed556e
  • Removing lint warnings e1fb95c

3.3.14

1 August 2016

3.3.13

1 August 2016

  • Version bump for unpublished version on npm 002ad4b

3.3.12

1 August 2016

  • Replacing lws with uws, fixes #66 #66

3.3.11

4 May 2016

  • Upgrading turtle.io to get a logging fix, version bump c38b32e

3.3.10

4 May 2016

  • Fixing handling of cache-control header & changing the default value, fixes #61 (again) #61

3.3.9

3 May 2016

  • Fixing cache-control header decoration of a private response, fixes #61 for real #61

3.3.8

3 May 2016

  • Upgrading turtle.io to get a header fix, fixes #61 #61

3.3.7

2 May 2016

  • Handling the failure of instantiating lws & coap in such a way that it's OS agnostic a70d44c

3.3.6

20 April 2016

  • Fixing support for Windows by conditionally enabling coap & websocket 2ba36ab

3.3.5

29 March 2016

  • No need to call server.headers() from respond(), updating turtle.io to fix range header handling, fixes #60 #60

3.3.4

29 March 2016

  • Specifying a server header value 68a89da

3.3.3

28 February 2016

  • Upgrading turtle.io to gain this.server.parse(), locking dependencies to minor updates for perceived stability 0dff97d

3.3.2

24 February 2016

  • Adding a parameter to this.serialize() for IoT protocols c7a3a7b

3.3.1

21 February 2016

3.3.0

21 February 2016

  • Adding a COAP server by config, fixes #59 #59

3.2.1

21 February 2016

  • Updating misc documents, no code change 0b9b752

3.2.0

21 February 2016

  • Dropping the spread operator 'cause babel is fucking it up, lowering default hsts maxAge, fixes #57 #57
  • Fleshing out the WebSocket integration 018cd48
  • Adding a content-disposition header to the CSV renderer, removing this.messages, adding websocket module (WIP) 158028d
  • Making some changes (WIP) 49fc8ed

3.1.1

17 February 2016

  • Fixing error() such that it passes a response body (regression [for building on top] due to refactoring) f912e3b

3.1.0

16 February 2016

  • 3.1 dev #58
  • Initial changes to support turtle.io 6.0 5c7b4fa
  • Updating README 6a55062
  • Updating all dependencies d7307dc

3.0.3

28 December 2015

  • Removing baked in functions for modules 6d12632
  • Moving sass file into ./www 09467e2
  • Updating dtrace script, removing jsdoc config 1283b4a

3.0.2

20 December 2015

3.0.1

20 December 2015

  • Fixing the XML renderer via dependency update e28bf81

3.0.0

19 December 2015

  • 3.0 #55
  • Not rate limiting (explicit) "unprotected" routes, fixes #52 #52
  • Deleting generated docs fe34730
  • Initial build passing lint f56ad44
  • Fixing hypermedia tests, fleshing out the test routes such that it's reasonable, enabling the renderer tests (XML is failing) bf0ccb6

2.0.7

26 October 2015

  • Upgrading deps, changing travis-ci.org config c4b2d7d

2.0.6

10 September 2015

  • Upgrading deps to solve a proxy regression c500840

2.0.5

9 September 2015

  • Fixing a regression from 2.0.4 c438657

2.0.4

9 September 2015

  • Changes to support turtle.io 4.1.0 e0d9ffc
  • Upgrading to turtle.io 4.1.1 555abe0

2.0.3

4 July 2015

  • Updating the HTML renderer template 398b152

2.0.2

4 July 2015

  • Updating config & core dependencies c736e79
  • Updating CHANGELOG 8b31fec

2.0.1

17 June 2015

  • Updating CHANGELOG 41d328b
  • Updating README, version bump for npm 34b7873

2.0.0

15 June 2015

  • 2.0 #45
  • Putting route validation a head of csrf validation, fixes #48 #48
  • Making hypermedia generation smartr, fixes #46 #46
  • Changing the response shape, fixes #43 #43
  • Adding eslint to grunt test, making it lint! 4772e18
  • Reformatting code based on new IDE settings, completely superficial ebf0d88
  • Implementing a shallow clone without the try/catch 9fa91b5

1.6.1

7 June 2015

  • Fixing how how the form is shown in the browsable UI c18459a

1.6.0

4 June 2015

  • Completing "unprotect" routes, removing fat arrow abuse 5c81f2e
  • Adding the notion of an "unprotect" route [WIP] 640ad1d

1.5.2

2 June 2015

1.5.1

25 May 2015

  • Allowing empty payloads in the browsable API, fixes #42 #42

1.5.0

25 May 2015

  • Applying hypermedia pagination to GET requests only, fixes #41 #41
  • Upgrading turtle.io to 4.0.0, initial changes to support it (WIP) e0fcbb2
  • Undoing changes to test dc7bd66
  • Upgrading turtle.io for custom error handling 854cae2

1.4.9

19 April 2015

1.4.8

14 April 2015

  • Adding title attribute to anchors in browsable API c0fd541

1.4.7

14 April 2015

  • Adding title attribute to generated anchors in browsable API dbda890

1.4.6

13 April 2015

  • Changing <code> parsing to separate keys & items d54a1af

1.4.5

13 April 2015

  • Fixing an erroneous dep version bump 6cc6198

1.4.4

13 April 2015

  • Fixing / refactoring prepare(), fixes #40 #40

1.4.3

10 April 2015

  • Adding title attribute to config which is used by the browsable API a36b0b6

1.4.2

9 April 2015

  • Updating keigai, changing to array.each(), reformatting code based on IDE settings 97bb22e
  • Updating tests 0747e84
  • Updating test 220784a

1.4.1

2 April 2015

  • Splitting up tests e897a15
  • Refactoring array.iterate() to array.each(), updating keigai & turtle.io 076b6cb
  • Extending test timeouts to 5s 488999e

1.4.0

2 April 2015

  • Adding renderer(name, fn, mimetype) to add custom renderers, fixes #31 #31
  • Adding a CSV renderer, fixes #38 #38
  • Semver bump to 1.4.0 due to new renderer() method 0558504

1.3.21

1 April 2015

  • Tweaking media queries, fixes #37 #37
  • Fixing JSON validation in the browsable API, fixing req.body parsing such that the body is not discarded if it cannot be parsed to JSON, fixes #36 #36
  • Fixing CSS 7931ec3
  • Fixing nav click handling, fixing error display (shape) a8a3937
  • No string comparisons! fd6d9ac

1.3.20

1 April 2015

  • Fixing a reference error, which was meant to fix a parsing error (turtles!) d5b94bf

1.3.19

1 April 2015

  • Making request error handling more durable in the browsable API interface, fixes #35 #35

1.3.18

31 March 2015

  • Finishing v2 Browsable API, fixes #24 #24
  • Making progress on v2 of browsable API by adding the notion of a Request & Response view toggle, the request view is partially implemented 3a1fd62
  • Wiring error handling 2116aff
  • Returning to the identity operator a136811

1.3.17

30 March 2015

  • Fixing H2 line height, adding tests for renderers df47036

1.3.16

30 March 2015

  • Adding a label for the select input, converting indents to tabs 9c2b657

1.3.15

30 March 2015

  • Fixing spacing & a typo that comma operator kept valid (wooo!) 220a1ff

1.3.14

30 March 2015

  • Wiring up the select input f268b53
  • Wiring up the select field [WIP] e72ecf0
  • Adding support for ?format=$renderer query string parameter which is higher priority than the Accept header (explicit vs implicit) acd25d7

1.3.13

30 March 2015

  • Changing "CSS reset" to one I prefer more 877e83e

1.3.12

29 March 2015

  • Tweaking responsive template 94a2ad6

1.3.11

29 March 2015

  • Tweaking responsive template ae0eb44

1.3.10

29 March 2015

1.3.9

29 March 2015

  • Tweaking responsive template 144dc25

1.3.8

29 March 2015

  • Removing PureCSS and writing responsive CSS by hand, fixes #28 #28

1.3.7

29 March 2015

  • Sorting browsable API headers, fixes #30 #30

1.3.6

29 March 2015

  • Upgrading turtle.io, fixes #29 #29

1.3.5

29 March 2015

  • Upgrading turtle.io, fixes #29 #29

1.3.4

29 March 2015

  • Fixing visibility of all response headers, fixes #27 #27

1.3.3

29 March 2015

  • Fixing browsable API URL header, fixes #26 #26

1.3.2

29 March 2015

  • Embedding CSS, & JavaScript in browsable API template, fixes #25 #25

1.3.1

29 March 2015

  • Fixing the browsable status header value 4eea940
  • Fixing the browsable status header value 5798ec4
  • Updating CHANGELOG 9076695

1.3.0

29 March 2015

  • Fixing error() such that it routes through the instance of Tenso, adding support for HTML, YAML, & XML output via new renderers (JSON remains of course); HTML is not implemented yet d2fa0dd
  • Getting a read only HTML renderer mostly functional [WIP] 34281e4
  • Activating URIs within the browsable API template e834374

1.2.6

26 March 2015

  • Updating CHANGELOG 0b0d6ae
  • Updating keigai & turtle.io for proper headers on compressed responses e96b7f8

1.2.5

20 March 2015

1.2.4

19 March 2015

  • Updated keigai & turtle.io bec889f

1.2.3

12 March 2015

  • Updated to keigai 1.2.0, implemented array.iterate() bfa085e

1.2.2

25 February 2015

  • Updated babel transpiler (renamed), updated core dependencies, added io.js (latest stable) to travis-ci 6438864

1.2.1

13 February 2015

  • Updated 6to5 for better transpiling, updated turtle.io for a significant change 'under the hood' d389dc1

1.2.0

3 February 2015

1.1.1

31 January 2015

  • Upgrading keigai, & turtle.io dependencies c2fa096

1.1.0

11 January 2015

  • Add a Gitter chat badge to README.md #21
  • Packaging build, fixes #22 #22
  • Fixing failing tests 1144e9f
  • Enabled CSRF protection by default, tests not passing e4addfe
  • Partial fix for #22, requires a change in turtle.io 9509cf7

1.0.1

13 December 2014

  • Updating turtle.io dependency & fixing how tests are written dc8fb1d
  • Fixing this.respond() by not assuming a cache-control header exists 1cd9036

1.0.0

1 December 2014

  • Upgrading keigai & turtle.io dependencies 513c9f9

0.9.27

24 November 2014

  • Utilizing req.allows in this.respond() 363ead8

0.9.26

22 November 2014

  • Fixing this.respond() by passing a required parameter to this.server.allows() bcd614f

0.9.25

22 November 2014

  • Identifying as tenso in logging strategies, created dtrace.sh to convenient probe output 156aa0f

0.9.24

18 November 2014

  • Fixing pluralization of hypermedia keys bdc0d41

0.9.23

7 November 2014

  • Fixing Tenso.rate() by removing the per hour notion and implement the seconds offset afforded by configuration 11c2669
  • Refactoring rate limiting to ignore Authorization header, as it provides an attack vector 0601e3d

0.9.22

6 November 2014

  • Fixing a regression of rate() execution against protected routes 5e10538

0.9.21

6 November 2014

  • Optimizing respond() by moving 0.9.20 into it, reformatted code based on my WebStorm9 config (keeping it pretty for humans) a34f599

0.9.20

6 November 2014

  • Adding automatic private directive to cache-control header when client is authenticated 04a9012

0.9.19

5 November 2014

  • Changing rate limiting such that it can be 'resized' 2d8ba14

0.9.18

5 November 2014

  • Moving rate() into keymaster() such that it always executes 62242da

0.9.17

5 November 2014

  • Adding rate.override to config which accepts req & rate, and must return rate, such that rate limiting is customizable, fixes #19 #19

0.9.16

2 November 2014

  • Updating dependency, fixes #16 #16
  • Fixing the x-ratelimit-remaining value upon reset, fixes #17 #17
  • Loosening dependency versions, fixed hypermedia() by implementing 'X-Forwarded-Proto' header, fixes #18 #18

0.9.15

24 October 2014

  • Upgrading dependencies (disables SSLv2) 5f4f27f

0.9.14

23 October 2014

  • Updating dependencies to protect against POODLE 0d54348

0.9.13

20 October 2014

0.9.12

16 October 2014

  • Updating dependencies & CSS files 0fd6008

0.9.11

9 October 2014

0.9.10

7 October 2014

  • Fixing a log error in bootstrap() when enabling SSL 0426c9a

0.9.9

3 October 2014

  • Updating turtle.io to gain automatic handling of CORS requests from a browser b43b26f

0.9.8

3 October 2014

  • Refactored Local Auth to not redirect CORS requests from a browser, and return a success message f902927

0.9.7

3 October 2014

0.9.6

2 October 2014

0.9.5

20 September 2014

  • Fixing hypermedia() when URI has a trailing slash and is a collection, adding a test e76fc74

0.9.4

18 September 2014

  • Changing /logout such that it works without being a protected route 4dc3e9e

0.9.3

18 September 2014

  • Made hypermedia() smartr by not mutating the result when it's an Array of URIs, for obvious data modeling issues! 0182190

0.9.2

12 September 2014

0.9.1

9 September 2014

0.9.0

6 September 2014

  • Making hypermedia() smartr by knowing when a key is an item or a related URI, & to not remove link keys for obvious data modeling issues! 7959bd5

0.8.3

6 September 2014

  • Fixing hypermedia() when dealing with collections: Array of Objects e.g. a record set, adding a test 14c8ab2

0.8.2

6 September 2014

0.8.1

3 September 2014

  • Fixing an oversight in two conditionals within auth() 926dc74

0.8.0

2 September 2014

  • Refactored auth() & created 'by config' end points for Basic & Bearer under /auth, such that they don't collide with stateful strategies, updated hypermedia() to add a collection link for non Array/Object representations & to set a rel of item for Array based links, updated tests, fixes #15 #15

0.7.2

1 September 2014

  • Enabling auth.linkedin.scope (missed it), removing double blacklist() of middleware within each authentication strategy bc7dde7

0.7.1

28 August 2014

  • Updating docs 2cf3b06
  • Adding automatic JSON parsing to parse() middleware bd402a9
  • Removing a deprecated condition aa6ba1c

0.7.0

28 August 2014

  • Creating config.auth.redirect which defaults to /, fixes #14 #14
  • Refactored auth() to support stateless & stateful strategies at the same time, fixes #13 (failing test has to wait until later - don't use this sha!) #13
  • Adding OAuth2 & SAML authentication, fixes #10, & fixes #12 #10 #12
  • Created parse() middleware via bootstrap() for interop with express centric middleware 4b67d75
  • Updating SAML auth parameters, updating README 31b79c6
  • Fixing Local Auth guard & test 46ca355

0.6.1

25 August 2014

  • Refining the basic auth tests f126fd3
  • Upgrading turtle.io to 3.0.15 for etag middleware fix (out of order execution negated it) c7e20eb

0.6.0

24 August 2014

  • Making /auth support more than one active strategy, fixes #9 in spirit #9
  • Changed auth config such that protected routes are defined under the strategies 14e328c
  • Moved mediator() middleware out of auth() and into bootstrap(), fixed redundant variable initialization in Tenso.prototype.rate(), added CSS map file 16ca5b0

0.5.2

21 August 2014

  • Updated hypermedia() to apply the same logic to Entity reps, updated tests 64fdf66

0.5.1

21 August 2014

  • Changed data.result to null if all content is lifted into data.link, updated tests 088eb57

0.5.0

21 August 2014

  • Significant change to how responses are processed as hypermedia (see CHANGELOG) 7a2ee0e

0.4.4

19 August 2014

  • Fixed keymaster() for HEAD & OPTIONS requests, fixes #6 #6
  • Fixed blacklisting of middleware within auth(), fixes #7 #7
  • Stragglers 42c6332

0.4.3

18 August 2014

  • Blacklisting authentication middleware ac4a395

0.4.2

16 August 2014

  • Added lusca for security, added grunt-nsp-package for module vulnerability scanning during package task dac3270
  • Updating README 61f5429

0.4.1

16 August 2014

  • Fixed an edge case in hypermedia() such that the URI is not lifted into the links Array via automagic & added a collection link for an Entity representation [RFC6573] & updated test, cached RegExp invariants 90639dc
  • Updating README 5b84aa1

0.4.0

15 August 2014

  • Added Facebook authentication via passport, fixed the RegExp used to retrieve the rate limit id from the authorization header, moved authentication gateway middleware into zuul() 38a4162
  • Getting auth() working with passport.js flow (sessions only atm), naming zuul() & keymaster() for debugging purposes & upgrading turtle.io to 3.0.10 for the same reason d92c9f5
  • Added LinkinIn authentication 07ba0bd

0.3.6

8 August 2014

  • Upgraded turtle.io to 2.3.0, & refactored Basic Auth to use passport 97f4ad5

0.3.5

7 August 2014

  • Fixing tests, fixes #3 #3

0.3.4

7 August 2014

  • Updating config.json with more options of turtle.io, upgrading turtle.io to gain accept: application/json; indent=n driven pretty JSON, fixes #4 #4

0.3.3

7 August 2014

  • Tweaking how wildcards are supported in protected paths e35b0cb
  • Enabling test assertions to debug erroneous response body 4128802

0.3.2

7 August 2014

  • Disabled compression when SSL is enabled, fixed wildcards in protect Array under auth, fixes #1 & fixes #2 #1 #2

0.3.1

6 August 2014

  • Added maxBytes configuration flag to enforce limits on PATCH, POST, & PUT requests & added a test, upgrading turtle.io to 2.2.4 480f4e8
  • Setting default maxBytes size of 1 MB, updating README & CHANGELOG 6dbdd94

0.3.0

5 August 2014

  • Minor tweaks to rate limiting, adding a test 79136e4
  • Fleshing out rate(), creating Tenso.rates{} & Tenso.rate(), fixing alignment, creating Tenso.rates to store rate limiting data, creating Tenso.rates() to be called from rate() middleware 793ebdc
  • Initial rate limiting middleware hook, reverted a change to the Grunt file, such that 'test' runs jshint & mocha tests, updated turtle.io dep, fixing mistakes missed during erroneous 'test' phase 8d6815e

0.2.0

4 August 2014

  • Adding local authentication 6e151e3
  • Updating npm ignore, resetting an auth state in sample.js c042c49
  • Updating README 8512981

0.1.1

4 August 2014

  • Decorating hostname on Tenso instance, removed unwanted function, refactored tests to use multiple servers, added tests for authentications ca4e114
  • Updating README 8d8ba5d
  • Updating README ce86758

0.1.0

3 August 2014

  • Adding middleware to handle protected routes for none Basic Auth, updating deps 7f23a4f
  • Implementing Bearer Token auth ecfdcd8
  • Creating auth() and starting to refactor ce3615e

0.0.10

3 August 2014

  • Fixing hypermedia() by ensuring no link Objects when a collection is empty, added a test ed126f1

0.0.9

3 August 2014

  • Fixing hypermedia() URI reconstruction by encoding the query string values, added a test ce788db

0.0.8

3 August 2014

  • Fixing hypermedia() to deal with an out of bounds page bfc8e9b
  • Adding a 404 test 8da5cae

0.0.7

3 August 2014

  • Changing pagination link generation such that first & prev cannot be the same URI, updating turtle.io dep, adding hippie functional tests dc33597

0.0.6

2 August 2014

  • Changing the default hypermedia link rel to related for a more generic implied relationship 8b52276
  • Updating README 9e7b1a1

0.0.5

2 August 2014

  • Implementing hypermedia & automagic pagination d2e79f0
  • Adding Object support to hypermedia() for consistent automagic links 88f5535

0.0.4

2 August 2014

  • Implementing Basic Auth by config 1a71265

0.0.3

2 August 2014

  • Created response() & added it to the exports, updated README & sample app 182d9c6
  • Cleaning up API such that it's less juggling to send a response f456bdc

0.0.2

2 August 2014

  • Getting routing wired in with an external routes.js to be overridden by configuration 8b15cad
  • Adding support for handlers on routes 4cb2300
  • Making the configuration Object optional, adding a CHANGELOG, updating config.json such that it doesn't inherit the "sample" routes 92b05f9

0.0.1

1 August 2014