UNPKG

@node-elion/utils

Version:

Super scalable enterprise Node.js server library

90 lines 3.1 kB
/* 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