UNPKG

@resin/pinejs

Version:

Pine.js is a sophisticated rules-driven API engine that enables you to define rules in a structured subset of English. Those rules are used in order for Pine.js to generate a database schema and the associated [OData](http://www.odata.org/) API. This make

67 lines 1.78 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const _ = require("lodash"); const Promise = require("bluebird"); const control_flow_1 = require("./control-flow"); class Hook { constructor(hookFn) { this.hookFn = hookFn; } run(...args) { return Promise.try(() => { return this.hookFn(...args); }); } } exports.Hook = Hook; class SideEffectHook extends Hook { constructor(hookFn) { super(hookFn); this.rollbackFns = []; this.rolledBack = false; } registerRollback(fn) { if (this.rolledBack) { Promise.try(fn); } else { this.rollbackFns.push(fn); } } rollback() { if (this.rolledBack) { return; } this.rolledBack = true; return control_flow_1.settleMapSeries(this.rollbackFns, (fn) => fn()).return(); } } exports.SideEffectHook = SideEffectHook; const undoHooks = function (request) { return control_flow_1.settleMapSeries(_.flatten(_.values(request.hooks)), (hook) => { if (hook instanceof SideEffectHook) { return hook.rollback(); } }); }; exports.rollbackRequestHooks = function (request) { if (_.isArray(request)) { return control_flow_1.settleMapSeries(request, undoHooks); } else { return undoHooks(request); } }; exports.instantiateHooks = function (hooks) { return _.mapValues(hooks, (typeHooks) => { return _.map(typeHooks, (hook) => { if (hook.effects) { return new SideEffectHook(hook.HOOK); } else { return new Hook(hook.HOOK); } }); }); }; //# sourceMappingURL=hooks.js.map