UNPKG

@freemework/common

Version:

Common library of the Freemework Project.

105 lines 4.45 kB
import { FCancellationToken } from "../cancellation/index.js"; import { FExceptionInvalidOperation } from "../exception/f_exception_invalid_operation.js"; export class FExecutionContext { static _defaultExecutionContext = null; /** * Provide empty execution context. Usually used as root of execution context chain. */ static get Empty() { return emptyExecutionContext; } /** * Provide default execution context. */ static get Default() { if (FExecutionContext._defaultExecutionContext === null) { // throw new FExceptionInvalidOperation(`Default execution context was not set yet. Try to call ${FExecutionContext.name}.setDefaultExecutionContext() before.`); console.warn(`Default execution context was set to internal default value. We recommend you to call ${FExecutionContext.name}.setDefaultExecutionContext() with your application context.`); FExecutionContext._defaultExecutionContext = new FCancellationExecutionContext(emptyExecutionContext, FCancellationToken.Dummy); } return FExecutionContext._defaultExecutionContext; } static set Default(executionContext) { if (FExecutionContext._defaultExecutionContext !== null) { throw new FExceptionInvalidOperation("Unable to set FExecutionContext.Default twice. Please set this before first access FExecutionContext.Default property."); } FExecutionContext._defaultExecutionContext = executionContext; } /** * Obtain a closest instance of typed `FExecutionContext` that encloses * the given context. * * Returns `null` if requested type not found */ static findExecutionContext(context, clz) { let chainItem = context; while (chainItem !== null) { if (chainItem instanceof clz) { return chainItem; } chainItem = chainItem.prevContext; } return null; } /** * Obtain a closest instance of typed `FExecutionContext` that encloses * the given context. * * Raise `FExceptionInvalidOperation` if requested type not found */ static getExecutionContext(context, clz) { const chainItem = FExecutionContext.findExecutionContext(context, clz); if (chainItem !== null) { return chainItem; } throw new FExceptionInvalidOperation(`Execution context '${clz.name}' is not presented on the chain.`); } static listExecutionContexts(context, clz) { const result = []; let chainItem = context; while (chainItem != null) { if (chainItem instanceof clz) { result.push(chainItem); } chainItem = chainItem.prevContext; } return Object.freeze(result); } } export class FExecutionElement { _owner; constructor(owner) { this._owner = owner; } get owner() { return this._owner; } } export class FExecutionContextBase extends FExecutionContext { get prevContext() { return this._prevContext; } constructor(prevContext) { super(); this._prevContext = prevContext; } static get Empty() { throw new FExceptionInvalidOperation("Cannot use a member via inherit class. Use FExecutionContext.Empty instead."); } static get Default() { throw new FExceptionInvalidOperation("Cannot use a member via inherit class. Use FExecutionContext.Default instead."); } static findExecutionContext(_, __) { throw new FExceptionInvalidOperation("Cannot use a member via inherit class. Use FExecutionContext.findExecutionContext instead."); } static getExecutionContext(_, __) { throw new FExceptionInvalidOperation("Cannot use a member via inherit class. Use FExecutionContext.getExecutionContext instead."); } static listExecutionContexts(_, __) { throw new FExceptionInvalidOperation("Cannot use a member via inherit class. Use FExecutionContext.listExecutionContexts instead."); } _prevContext; } class _EmptyExecutionContext extends FExecutionContext { get prevContext() { return null; } } const emptyExecutionContext = new _EmptyExecutionContext(); // Import here due to cyclic dependencies import { FCancellationExecutionContext } from "../cancellation/f_cancellation_execution_context.js"; //# sourceMappingURL=f_execution_context.js.map