in lib/request-context.ts [111:169]
private prepareExecutionStack(entryPointName: string): Interceptor[] {
// If nothing has been overrided, use cached execution stack directly.
if (this._perRequestObjectContext.def.namedObjectDefs.length == 0) {
if (this._entryPoint == null) {
throw new Error("Entrypoint '" + entryPointName + "' does not exist.");
}
return this._application.getExecutionStack(entryPointName);
}
// Per-request override happens, it could be entrypoint override or interceptor override.
let entryPointObject = this.getNamedObject(entryPointName);
let interceptorNames: string[] = entryPointObject.def.value.executionStack;
if (interceptorNames == null) {
interceptorNames = this.app.settings.defaultExecutionStack;
}
// When entrypoint is not overriden, check if interceptor definition has be overriden.
if (entryPointObject.scope !== 'request') {
let oldStack = this.app.getExecutionStack(entryPointName);
let newStack: Interceptor[] = [];
// Definition and pre-cached execution stack should align.
assert(oldStack.length == interceptorNames.length);
for (let i = 0; i < oldStack.length; ++i) {
let interceptorName = interceptorNames[i];
let interceptorObject = this.getNamedObject(interceptorName);
if (interceptorObject == null) {
throw("Interceptor '" + interceptorName + "' does not exist.");
}
if (interceptorObject.scope !== 'request') {
newStack.push(oldStack[i]);
}
else {
// Interceptor is overriden from request. Look up new.
if (interceptorObject.value == null
|| interceptorObject.def.value._type !== 'Interceptor') {
throw new Error("Bad override on interceptor '"
+ interceptorName
+ "', should be of Interceptor type and not null. ")
}
newStack.push(interceptorObject.value);
}
}
return newStack;
}
// Per-request override happens on current entry point.
let newStack: Interceptor[] = [];
for (let interceptorName of interceptorNames) {
let interceptor = this.getInterceptor(interceptorName);
if (interceptor == null) {
throw new Error("Interceptor '" + interceptorName + "' is not a valid interceptor.");
}
newStack.push(interceptor);
}
return newStack;
}