UNPKG

@devcycle/nodejs-server-sdk

Version:

The DevCycle NodeJS Server SDK used for feature management.

118 lines 4.09 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; let variableMetadata; try { beforeContext = this.runBefore(savedHooks, context); const { variable, metadata } = resolver.call(beforeContext); variableDetails = variable; variableMetadata = metadata; this.runAfter(savedHooks, beforeContext, variableDetails, variableMetadata); } catch (error) { this.runError(reversedHooks, context, error); this.runFinally(reversedHooks, context, variableDetails, variableMetadata); if (error.name === 'BeforeHookError' || error.name === 'AfterHookError') { // make sure to return with a variable if before or after hook errors const { variable } = resolver.call(context); return variable; } throw error; } this.runFinally(reversedHooks, context, variableDetails, variableMetadata); 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, variableMetadata) { var _a; try { for (const hook of hooks) { hook.after(context, variableDetails, variableMetadata); } } 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, variableMetadata) { var _a; try { for (const hook of hooks) { hook.onFinally(context, variableDetails, variableMetadata); } } 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