UNPKG

@freemework/common

Version:

Common library of the Freemework Project.

111 lines 5.05 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.FExecutionContextBase = exports.FExecutionElement = exports.FExecutionContext = void 0; const index_js_1 = require("../cancellation/index.js"); const f_exception_invalid_operation_js_1 = require("../exception/f_exception_invalid_operation.js"); 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 f_cancellation_execution_context_js_1.FCancellationExecutionContext(emptyExecutionContext, index_js_1.FCancellationToken.Dummy); } return FExecutionContext._defaultExecutionContext; } static set Default(executionContext) { if (FExecutionContext._defaultExecutionContext !== null) { throw new f_exception_invalid_operation_js_1.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 f_exception_invalid_operation_js_1.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); } } exports.FExecutionContext = FExecutionContext; class FExecutionElement { _owner; constructor(owner) { this._owner = owner; } get owner() { return this._owner; } } exports.FExecutionElement = FExecutionElement; class FExecutionContextBase extends FExecutionContext { get prevContext() { return this._prevContext; } constructor(prevContext) { super(); this._prevContext = prevContext; } static get Empty() { throw new f_exception_invalid_operation_js_1.FExceptionInvalidOperation("Cannot use a member via inherit class. Use FExecutionContext.Empty instead."); } static get Default() { throw new f_exception_invalid_operation_js_1.FExceptionInvalidOperation("Cannot use a member via inherit class. Use FExecutionContext.Default instead."); } static findExecutionContext(_, __) { throw new f_exception_invalid_operation_js_1.FExceptionInvalidOperation("Cannot use a member via inherit class. Use FExecutionContext.findExecutionContext instead."); } static getExecutionContext(_, __) { throw new f_exception_invalid_operation_js_1.FExceptionInvalidOperation("Cannot use a member via inherit class. Use FExecutionContext.getExecutionContext instead."); } static listExecutionContexts(_, __) { throw new f_exception_invalid_operation_js_1.FExceptionInvalidOperation("Cannot use a member via inherit class. Use FExecutionContext.listExecutionContexts instead."); } _prevContext; } exports.FExecutionContextBase = FExecutionContextBase; class _EmptyExecutionContext extends FExecutionContext { get prevContext() { return null; } } const emptyExecutionContext = new _EmptyExecutionContext(); // Import here due to cyclic dependencies const f_cancellation_execution_context_js_1 = require("../cancellation/f_cancellation_execution_context.js"); //# sourceMappingURL=f_execution_context.js.map