@hapiness/core
Version:
Project to have a HapiJS (https://hapijs.com/) based framework to create easier NodeJS back-end with some awesome features
46 lines • 1.65 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const rxjs_1 = require("rxjs");
const decorators_1 = require("./decorators");
const logger_1 = require("./logger");
class HookManager {
/**
* Check if a token has a hook implemented
*
* @param {string} hook
* @param {Type} token
* @returns boolean
*/
static hasLifecycleHook(hook, token) {
return token instanceof decorators_1.Type && hook in token.prototype;
}
/**
* Trigger the hook if
* it is implemented
*
* @param {string} hook
* @param {Type} token
* @param {T} instance
* @param {any[]} args
* @param {boolean} throwErr
* @returns Observable
*/
static triggerHook(hook, token, instance, args, throwErr) {
return rxjs_1.Observable
.merge(rxjs_1.Observable
.of(this.hasLifecycleHook(hook, token))
.filter(_ => !!_)
.map(_ => Reflect.apply(instance[hook], instance, args || []))
.flatMap(_ => (_ instanceof rxjs_1.Observable) ?
_ : !!_ ?
rxjs_1.Observable.of(_) :
rxjs_1.Observable.empty()), rxjs_1.Observable
.of(this.hasLifecycleHook(hook, token))
.filter(_ => !_ && throwErr)
.flatMap(_ => rxjs_1.Observable.throw(new Error(`Hook missing ${hook} on ${token.name}`))))
.do(_ => this.logger.debug(`Triggering hook '${hook}' on '${token.name}'`));
}
}
HookManager.logger = new logger_1.InternalLogger('hook');
exports.HookManager = HookManager;
//# sourceMappingURL=hook.js.map