UNPKG

@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
"use strict"; 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