@freemework/common
Version:
Common library of the Freemework Project.
111 lines • 5.05 kB
JavaScript
;
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