restify-enroute
Advanced tools
Comparing version 5.0.0 to 6.0.0
@@ -21,2 +21,3 @@ 'use strict'; | ||
* validate. | ||
* @param {boolean} [opts.hotReload] Whether to hot reload the routes | ||
* @param {string} opts.server The restify server to install the routes | ||
@@ -43,3 +44,4 @@ * onto. | ||
server: opts.server, | ||
basePath: ctx.basePath | ||
basePath: ctx.basePath, | ||
hotReload: opts.hotReload | ||
}, function (err) { | ||
@@ -46,0 +48,0 @@ return _cb(err); |
@@ -9,3 +9,9 @@ 'use strict'; | ||
var verror = require('verror'); | ||
var compose = require('restify').helpers.compose; | ||
var bunyan = require('bunyan'); | ||
// local globals | ||
var LOG; | ||
/** | ||
@@ -16,2 +22,4 @@ * Install the enroute routes into the restify server. | ||
* @param {object} opts.enroute The parsed enroute configuration. | ||
* @param {object} opts.log an optional logger | ||
* @param {boolean} [opts.hotReload] Whether to hot reload the routes | ||
* @param {object} opts.server The restify server. | ||
@@ -24,6 +32,20 @@ * @param {string} opts.basePath The basepath to resolve source files. | ||
assert.object(opts, 'opts'); | ||
assert.optionalObject(opts.log, 'opts.log'); | ||
assert.object(opts.enroute, 'opts.enroute'); | ||
assert.object(opts.server, 'opts.server'); | ||
assert.string(opts.basePath, 'opts.basePath'); | ||
assert.optionalBool(opts.hotReload, 'opts.hotReload'); | ||
var log; | ||
if (opts.log) { | ||
log = opts.log.child({ component : 'enroute' }); | ||
} else { | ||
// only create default logger if one wasn't passed in. | ||
if (!LOG) { | ||
LOG = bunyan.createLogger({ name: 'enroute' }); | ||
} | ||
log = LOG; | ||
} | ||
vasync.pipeline({arg: {}, funcs: [ | ||
@@ -38,2 +60,7 @@ // Read the routes from disk and parse them as functions | ||
if (opts.hotReload) { | ||
log.info({ basePath: opts.basePath }, | ||
'hot reloading of routes is enabled for base dir'); | ||
} | ||
// go through each of the route names | ||
@@ -49,9 +76,23 @@ _.forEach(opts.enroute.routes, function (methods, routeName) { | ||
try { | ||
var func = (opts.hotReload) ? | ||
// restify middleware wrapper for hot reload | ||
function enrouteHotReloadProxy(req, res, next) { | ||
return reloadProxy({ | ||
basePath: opts.basePath, | ||
method: method, | ||
req: req, | ||
res: res, | ||
routeName: routeName, | ||
sourceFile: sourceFile | ||
}, next); | ||
} : require(sourceFile); | ||
route = { | ||
name: routeName, | ||
method: method, | ||
func: require(sourceFile) | ||
func: func | ||
}; | ||
} catch (e) { | ||
return cb1(new verror.VError({ | ||
name: 'EnrouteRequireError', | ||
cause: e, | ||
@@ -63,3 +104,3 @@ info: { | ||
} | ||
}, 'route function is invalid')); | ||
}, 'failed to require file, possible syntax error')); | ||
} | ||
@@ -98,2 +139,62 @@ // if HTTP method is 'delete', since restify uses 'del' | ||
/** | ||
* using the restify handler composer, create a middleware on the fly that | ||
* re-requires the file on every load executes it. | ||
* @private | ||
* @function reloadProxy | ||
* @param {Object} opts an options object | ||
* @param {String} opts.basePath The basepath to resolve source files. | ||
* @param {String} opts.method http verb | ||
* @param {Object} opts.log the enroute logger | ||
* @param {Object} opts.req the request object | ||
* @param {Object} opts.res the response object | ||
* @param {String} opts.routeName the name of the restify route | ||
* @param {String} opts.sourceFile the response object | ||
* @param {Function} cb callback fn | ||
* @returns {undefined} | ||
*/ | ||
function reloadProxy(opts, cb) { | ||
assert.object(opts, 'opts'); | ||
assert.string(opts.basePath, 'opts.basePath'); | ||
assert.string(opts.method, 'opts.method'); | ||
assert.object(opts.req, 'opts.req'); | ||
assert.object(opts.res, 'opts.res'); | ||
assert.string(opts.routeName, 'opts.routeName'); | ||
assert.string(opts.sourceFile, 'opts.sourceFile'); | ||
assert.func(cb, 'cb'); | ||
// clear require cache for code loaded from a specific base dir | ||
Object.keys(require.cache).forEach(function (cacheKey) { | ||
if (cacheKey.indexOf(opts.basePath) !== -1) { | ||
delete require.cache[cacheKey]; | ||
} | ||
}); | ||
var handlers; | ||
try { | ||
handlers = require(opts.sourceFile); | ||
} catch (e) { | ||
var err = new verror.VError({ | ||
name: 'EnrouteRequireError', | ||
cause: e, | ||
info: { | ||
file: opts.sourceFile, | ||
route: opts.routeName, | ||
method: opts.method | ||
} | ||
}, 'failed to require file, possible syntax error'); | ||
// now that the chain has failed, send back the require error. | ||
return cb(err); | ||
} | ||
// if no require error, execute the handler chain. any errors that occur at | ||
// runtime should be a runtime exception. | ||
var handlerChain = compose(handlers); | ||
return handlerChain(opts.req, opts.res, cb); | ||
} | ||
module.exports = install; |
@@ -102,2 +102,5 @@ 'use strict' | ||
type: 'number' | ||
}, | ||
hotReload: { | ||
type: 'boolean' | ||
} | ||
@@ -104,0 +107,0 @@ }, |
{ | ||
"name": "restify-enroute", | ||
"version": "5.0.0", | ||
"version": "6.0.0", | ||
"main": "./lib/index.js", | ||
@@ -36,7 +36,8 @@ "description": "Config driven restify route creation", | ||
"eslint": "^3.8.1", | ||
"fs-extra": "^6.0.1", | ||
"istanbul": "^0.4.5", | ||
"jscs": "^3.0.7", | ||
"mkdirp": "^0.5.1", | ||
"mocha": "^3.1.2", | ||
"nsp": "^2.6.2", | ||
"restify": "^7.0.0", | ||
"restify-clients": "^1.4.0", | ||
@@ -48,3 +49,5 @@ "uuid": "^2.0.3" | ||
"assert-plus": "^1.0.0", | ||
"bunyan": "^1.8.12", | ||
"lodash": "^4.16.4", | ||
"restify": "^7.2.0", | ||
"vasync": "^1.6.4", | ||
@@ -51,0 +54,0 @@ "verror": "^1.6.0" |
@@ -71,5 +71,8 @@ # restify-enroute | ||
* `[opts.config]` The POJO of the enroute config. | ||
* `[opts.basePath]` Used with `[opts.config]`. The POJO requires a | ||
`basePath` to correctly resolve the route source file(s). | ||
* `[opts.basePath]` Used with `[opts.config]`. The POJO requires a | ||
`basePath` to correctly resolve the route source file(s). | ||
* `[opts.configPath]` The path to the enroute config on disk. | ||
* `[opts.hotReload]` Indicate whether you want the server to reload the | ||
route from disk each time a request is served, | ||
defaults to false | ||
* `cb` The callback. Returns `Error` if there's an error installing the routes. | ||
@@ -80,2 +83,6 @@ | ||
`opts.hotReload` allows the restify server to reload the route from disk each | ||
time the request is processed. This is extremely slow and should only be used | ||
in non-production instances. | ||
### Example | ||
@@ -82,0 +89,0 @@ ```javascript |
Dynamic require
Supply chain riskDynamic require can indicate the package is performing dangerous or unsafe dynamic code execution.
Found 1 instance in 1 package
New author
Supply chain riskA new npm collaborator published a version of the package for the first time. New collaborators are usually benign additions to a project, but do indicate a change to the security surface area of a package.
Found 1 instance in 1 package
26593
476
176
0
7
11
3
+ Addedbunyan@^1.8.12
+ Addedrestify@^7.2.0
+ Addedasn1@0.2.6(transitive)
+ Addedbalanced-match@1.0.2(transitive)
+ Addedbcrypt-pbkdf@1.0.2(transitive)
+ Addedbrace-expansion@1.1.11(transitive)
+ Addedbunyan@1.8.15(transitive)
+ Addedconcat-map@0.0.1(transitive)
+ Addedcsv@1.2.1(transitive)
+ Addedcsv-generate@1.1.2(transitive)
+ Addedcsv-parse@1.3.3(transitive)
+ Addedcsv-stringify@1.1.2(transitive)
+ Addeddashdash@1.14.1(transitive)
+ Addeddebug@2.6.9(transitive)
+ Addeddetect-node@2.1.0(transitive)
+ Addeddtrace-provider@0.8.8(transitive)
+ Addedecc-jsbn@0.1.2(transitive)
+ Addedescape-regexp-component@1.0.2(transitive)
+ Addedewma@2.0.1(transitive)
+ Addedextsprintf@1.3.0(transitive)
+ Addedfast-decode-uri-component@1.0.1(transitive)
+ Addedfind-my-way@1.18.1(transitive)
+ Addedformidable@1.2.6(transitive)
+ Addedgetpass@0.1.7(transitive)
+ Addedglob@6.0.4(transitive)
+ Addedhandle-thing@1.2.5(transitive)
+ Addedhpack.js@2.1.6(transitive)
+ Addedhttp-deceiver@1.2.7(transitive)
+ Addedhttp-signature@1.4.0(transitive)
+ Addedinflight@1.0.6(transitive)
+ Addedinherits@2.0.4(transitive)
+ Addedisarray@1.0.0(transitive)
+ Addedjsbn@0.1.1(transitive)
+ Addedjson-schema@0.4.0(transitive)
+ Addedjsprim@2.0.2(transitive)
+ Addedlodash.get@4.4.2(transitive)
+ Addedlru-cache@4.1.5(transitive)
+ Addedmime@1.6.0(transitive)
+ Addedminimalistic-assert@1.0.1(transitive)
+ Addedminimatch@3.1.2(transitive)
+ Addedminimist@1.2.8(transitive)
+ Addedmkdirp@0.5.6(transitive)
+ Addedmoment@2.30.1(transitive)
+ Addedms@2.0.0(transitive)
+ Addedmv@2.1.1(transitive)
+ Addednan@2.22.2(transitive)
+ Addedncp@2.0.0(transitive)
+ Addednegotiator@0.6.4(transitive)
+ Addedobject-inspect@1.13.4(transitive)
+ Addedobuf@1.1.2(transitive)
+ Addedonce@1.4.0(transitive)
+ Addedpath-is-absolute@1.0.1(transitive)
+ Addedpidusage@1.2.0(transitive)
+ Addedprocess-nextick-args@2.0.1(transitive)
+ Addedpseudomap@1.0.2(transitive)
+ Addedqs@6.14.0(transitive)
+ Addedreadable-stream@2.3.8(transitive)
+ Addedrestify@7.7.0(transitive)
+ Addedrestify-errors@5.0.0(transitive)
+ Addedret@0.1.15(transitive)
+ Addedrimraf@2.4.5(transitive)
+ Addedsafe-buffer@5.1.25.2.1(transitive)
+ Addedsafe-json-stringify@1.2.0(transitive)
+ Addedsafe-regex@1.1.0(transitive)
+ Addedsafer-buffer@2.1.2(transitive)
+ Addedselect-hose@2.0.0(transitive)
+ Addedsemver@5.7.2(transitive)
+ Addedsemver-store@0.3.0(transitive)
+ Addedside-channel@1.1.0(transitive)
+ Addedside-channel-list@1.0.0(transitive)
+ Addedside-channel-map@1.0.1(transitive)
+ Addedside-channel-weakmap@1.0.2(transitive)
+ Addedspdy@3.4.7(transitive)
+ Addedspdy-transport@2.1.1(transitive)
+ Addedsshpk@1.18.0(transitive)
+ Addedstream-transform@0.2.2(transitive)
+ Addedstring_decoder@1.1.1(transitive)
+ Addedtweetnacl@0.14.5(transitive)
+ Addedutil-deprecate@1.0.2(transitive)
+ Addeduuid@3.4.0(transitive)
+ Addedverror@1.10.0(transitive)
+ Addedwbuf@1.7.3(transitive)
+ Addedwrappy@1.0.2(transitive)
+ Addedyallist@2.1.2(transitive)