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