@node-elion/utils
Version:
Super scalable enterprise Node.js server library
90 lines • 3.1 kB
JavaScript
/* eslint-disable max-classes-per-file */
import { Logger } from "../logger";
export class BindFactory {
additionalContext = {};
executor;
constructor(executor, additionalContext) {
this.additionalContext = additionalContext;
this.executor = executor;
return this.emulateFunction();
}
emulateFunction() {
return Object.assign(async (...params) => this.executor.bind(this.additionalContext)(...params), {
...this,
bind: this.bind,
emulateFunction: this.emulateFunction,
});
}
bind(context) {
this.additionalContext = { ...this.additionalContext, ...context };
return this.emulateFunction();
}
}
export default class ChainAction {
actions;
__chainActions = true;
options;
logger;
constructor(options) {
this.options = {
logger: options?.logger ? options.logger : new Logger(),
chainName: options?.chainName ?? "",
ableRollback: options?.ableRollback ?? true,
optimizeSubChainActions: options?.optimizeSubChainActions ?? true,
usePreBind: options?.usePreBind ?? false,
};
this.logger = this.options.logger;
this.actions = [];
}
setExecutorContext(executor) {
return executor.bind({
__step: {
logger: this.logger,
chainName: this.options.chainName,
abort: this.abort.bind(this),
},
});
}
setRollbackContext(rollback) {
return rollback.bind({
__step: {
logger: this.logger,
chainName: this.options.chainName,
},
});
}
step(executor, rollback, options) {
this.actions.push({
executor: {
call: this.setExecutorContext(executor),
},
rollback: rollback
? {
call: this.setRollbackContext(rollback),
}
: null,
options: {
abortOnFail: options?.abortOnFail ?? true,
name: options?.name ?? "",
},
});
return Object.assign(async (...params) => this.execute.bind(this)(...params), this);
}
stepFactory(factory) {
const { executor, rollback, options } = factory({
executorBind: (executorFunction, additionalContext) => new BindFactory(executorFunction, additionalContext),
rollbackBind: (rollbackFunction, additionalContext) => new BindFactory(rollbackFunction, additionalContext),
});
return this.step(executor, rollback, options);
}
upgradeLogger(logger) {
this.logger = logger.child({ name: this.options.chainName });
return this;
}
// public turnToSubChain(): ChainAction {}
// eslint-disable-next-line class-methods-use-this,@typescript-eslint/no-unused-vars
execute(...params) { }
// eslint-disable-next-line class-methods-use-this
abort() { }
}
//# sourceMappingURL=chainActions.js.map