UNPKG

@devcycle/nodejs-server-sdk

Version:

The DevCycle NodeJS Server SDK used for feature management.

114 lines 3.78 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.EvalHooksRunner = void 0; const HookContext_1 = require("./HookContext"); class EvalHooksRunner { constructor(hooks = [], logger) { this.hooks = hooks; this.logger = logger; } runHooksForEvaluation(user, key, defaultValue, metadata, resolver) { const context = new HookContext_1.HookContext(user, key, defaultValue, metadata); const savedHooks = [...this.hooks]; const reversedHooks = [...savedHooks].reverse(); let beforeContext = context; let variableDetails; try { beforeContext = this.runBefore(savedHooks, context); variableDetails = resolver.call(beforeContext); this.runAfter(savedHooks, beforeContext, variableDetails); } catch (error) { this.runError(reversedHooks, context, error); this.runFinally(reversedHooks, context, undefined); if (error.name === 'BeforeHookError' || error.name === 'AfterHookError') { // make sure to return with a variable if before or after hook errors return resolver.call(context); } throw error; } this.runFinally(reversedHooks, context, variableDetails); return variableDetails; } runBefore(hooks, context) { var _a; const contextCopy = { ...context }; try { for (const hook of hooks) { const newContext = hook.before(contextCopy); if (newContext) { Object.assign(contextCopy, { ...contextCopy, ...newContext, }); } } } catch (error) { (_a = this.logger) === null || _a === void 0 ? void 0 : _a.error('Error running before hooks', error); throw new BeforeHookError(error); } return contextCopy; } runAfter(hooks, context, variableDetails) { var _a; try { for (const hook of hooks) { hook.after(context, variableDetails); } } catch (error) { (_a = this.logger) === null || _a === void 0 ? void 0 : _a.error('Error running after hooks', error); throw new AfterHookError(error); } } runFinally(hooks, context, variableDetails) { var _a; try { for (const hook of hooks) { hook.onFinally(context, variableDetails); } } catch (error) { (_a = this.logger) === null || _a === void 0 ? void 0 : _a.error('Error running finally hooks', error); } } runError(hooks, context, error) { var _a; try { for (const hook of hooks) { hook.error(context, error); } } catch (error) { (_a = this.logger) === null || _a === void 0 ? void 0 : _a.error('Error running error hooks', error); } } enqueue(hook) { this.hooks.push(hook); } } exports.EvalHooksRunner = EvalHooksRunner; class HooksRunnerError extends Error { constructor(error) { super(error.message); this.name = 'HooksRunnerError'; this.stack = error.stack; } } class BeforeHookError extends Error { constructor(error) { super(error.message); this.name = 'BeforeHookError'; this.stack = error.stack; } } class AfterHookError extends Error { constructor(error) { super(error.message); this.name = 'AfterHookError'; this.stack = error.stack; } } //# sourceMappingURL=EvalHooksRunner.js.map