@hapiness/core
Version:
Project to have a HapiJS (https://hapijs.com/) based framework to create easier NodeJS back-end with some awesome features
105 lines • 4.47 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const rxjs_1 = require("rxjs");
const hook_1 = require("../../core/hook");
const enums_1 = require("./enums");
const route_1 = require("./route");
const hapiness_1 = require("../../core/hapiness");
class LifecycleManager {
/**
* Initialize the lifecycle hooks
* for a route
*
* @param {MainModule} main
*/
static routeLifecycle(server, routes) {
server.ext(enums_1.LifecycleEventsEnum.OnPreAuth.toString(), (request, reply) => this.eventHandler(enums_1.LifecycleHooksEnum.OnPreAuth, routes, request, reply)
.subscribe(_ => reply.continue(), _ => hapiness_1.errorHandler(_)));
server.ext(enums_1.LifecycleEventsEnum.OnPostAuth.toString(), (request, reply) => this.instantiateRoute(routes, request, reply)
.subscribe(_ => reply.continue(), _ => hapiness_1.errorHandler(_)));
server.ext(enums_1.LifecycleEventsEnum.OnPreHandler.toString(), (request, reply) => this.eventHandler(enums_1.LifecycleHooksEnum.OnPreHandler, routes, request, reply)
.subscribe(_ => reply.continue(), _ => hapiness_1.errorHandler(_)));
server.ext(enums_1.LifecycleEventsEnum.OnPostHandler.toString(), (request, reply) => this.eventHandler(enums_1.LifecycleHooksEnum.OnPostHandler, routes, request, reply)
.subscribe(_ => reply.continue(), _ => hapiness_1.errorHandler(_)));
server.ext(enums_1.LifecycleEventsEnum.OnPreResponse.toString(), (request, reply) => this.eventHandler(enums_1.LifecycleHooksEnum.OnPreResponse, routes, request, reply)
.subscribe(_ => reply.continue(), _ => hapiness_1.errorHandler(_), () => request['_hapinessRoute'] = undefined));
}
/**
* Instantiate the route matching the request
* And trigger OnPreAuth hook
*
* @param {CoreRoute[]} routes
* @param {Request} request
* @param {ReplyWithContinue} reply
* @returns Observable
*/
static instantiateRoute(routes, request, reply) {
return rxjs_1.Observable
.of(routes)
.map(_ => this.findRoute(request, _))
.filter(_ => !!(_ && _.token))
.flatMap(route => route_1.RouteBuilder
.instantiateRouteAndDI(route, request)
.map(_ => ({ route, instance: _ })))
.do(_ => request['_hapinessRoute'] = _.instance)
.defaultIfEmpty(null)
.flatMap(_ => this.eventHandler(enums_1.LifecycleHooksEnum.OnPostAuth, routes, request, reply));
}
/**
* Find the matching route with
* path and method
*
* @param {Request} request
* @param {CoreRoute[]} routes
* @returns CoreRoute
*/
static findRoute(request, routes) {
const labels = this.arrayify(request.connection.settings.labels);
return routes
.find(r => ((r.method === request.route.method || r.method.indexOf(request.route.method) > -1) &&
(this.isRightLabels(labels, this.arrayify(r.labels))) &&
r.path === request.route.path));
}
/**
* Make sure to match the right route
* with the labels
*
* @param {string[]=[]} labels
* @param {string[]=[]} routeLabels
* @returns boolean
*/
static isRightLabels(labels = [], routeLabels = []) {
if (labels.length === 0 || routeLabels.length === 0) {
return true;
}
else {
return routeLabels.some(_ => labels.indexOf(_) > -1);
}
}
static arrayify(data) {
return [].concat(data).filter(_ => !!_);
}
/**
* Find the route and call
* the hook if the route component
* implements it
*
* @param {eRouteLifecycleHooks} event
* @param {MainModule} mainModule
* @param {} request
* @param {} reply
*/
static eventHandler(hook, routes, request, reply) {
return rxjs_1.Observable
.of(routes)
.map(_ => this.findRoute(request, _))
.filter(_ => request['_hapinessRoute'] && hook_1.HookManager.hasLifecycleHook(hook.toString(), _.token))
.flatMap(_ => hook_1.HookManager
.triggerHook(hook.toString(), _.token, request['_hapinessRoute'], [request, reply])
.defaultIfEmpty(null))
.isEmpty()
.filter(_ => !!_);
}
}
exports.LifecycleManager = LifecycleManager;
//# sourceMappingURL=lifecycle.js.map