@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
59 lines • 1.64 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.instantiateHooks = exports.rollbackRequestHooks = exports.SideEffectHook = exports.Hook = void 0;
const Bluebird = require("bluebird");
const _ = require("lodash");
const control_flow_1 = require("./control-flow");
class Hook {
constructor(hookFn) {
this.hookFn = hookFn;
}
async run(...args) {
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) {
Bluebird.try(fn);
}
else {
this.rollbackFns.push(fn);
}
}
rollback() {
if (this.rolledBack) {
return;
}
this.rolledBack = true;
return Bluebird.resolve(control_flow_1.settleMapSeries(this.rollbackFns, (fn) => fn())).return();
}
}
exports.SideEffectHook = SideEffectHook;
exports.rollbackRequestHooks = (hooks) => {
if (hooks == null) {
return;
}
control_flow_1.settleMapSeries(_(hooks).flatMap().compact().value(), (hook) => {
if (hook instanceof SideEffectHook) {
return hook.rollback();
}
});
};
exports.instantiateHooks = (hooks) => _.mapValues(hooks, (typeHooks) => {
return typeHooks.map((hook) => {
if (hook.effects) {
return new SideEffectHook(hook.HOOK);
}
else {
return new Hook(hook.HOOK);
}
});
});
//# sourceMappingURL=hooks.js.map