Created
November 18, 2017 17:08
-
-
Save delvedor/0cbb4aadefc5384ae17ad8305ea567e8 to your computer and use it in GitHub Desktop.
Routing based on the accept header
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
'use strict' | |
const assert = require('assert') | |
const Router = require('find-my-way') | |
const semver = require('semver') | |
function AcceptRouter (opts) { | |
if (!(this instanceof AcceptRouter)) { | |
return new AcceptRouter(opts) | |
} | |
this.opts = opts | |
this.accepts = {} | |
} | |
AcceptRouter.prototype.on = function on (method, path, version, handler, store) { | |
assert(semver.valid(version), 'The version should be a semver compatible string') | |
if (!this.hasRouter(version)) { | |
this.accepts[version] = Router(this.opts) | |
this.accepts[version].on(method, path, handler, store) | |
} else { | |
this.accepts[version].on(method, path, handler, store) | |
} | |
} | |
AcceptRouter.prototype.getRouter = function getVersion (version) { | |
const versions = Object.keys(this.accepts) | |
for (var i = 0, len = versions.length; i < len; i++) { | |
if (semver.satisfies(versions[i], version)) { | |
return this.accepts[versions[i]] | |
} | |
} | |
return null | |
} | |
AcceptRouter.prototype.hasRouter = function getVersion (version) { | |
const versions = Object.keys(this.accepts) | |
for (var i = 0, len = versions.length; i < len; i++) { | |
if (semver.satisfies(versions[i], version)) { | |
return true | |
} | |
} | |
return false | |
} | |
AcceptRouter.prototype.lookup = function lookup (req, res) { | |
var version = req.headers['accept-version'] | |
if (!this.validVersion(version)) { | |
res.statusCode = 400 | |
return res.end('Invalid version') | |
} | |
var router = this.getRouter(version) | |
if (router === null) { | |
res.statusCode = 400 | |
res.end(`Version '${version}' is not supported`) | |
} else { | |
router.lookup(req, res) | |
} | |
} | |
AcceptRouter.prototype.validVersion = function validVersion (version) { | |
try { | |
semver.validRange(version) | |
return true | |
} catch (e) {} | |
try { | |
semver.valid(version) | |
return true | |
} catch (e) {} | |
return false | |
} | |
module.exports = AcceptRouter |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment