2022-03-24 19:02:58 +00:00
|
|
|
import * as plugins from './typedrequest.plugins.js';
|
|
|
|
import { TypedResponseError } from './typedrequest.classes.typedresponseerror.js';
|
2019-08-25 15:19:12 +00:00
|
|
|
|
2020-10-06 16:37:25 +00:00
|
|
|
export type THandlerFunction<T extends plugins.typedRequestInterfaces.ITypedRequest> = (
|
2020-02-11 18:55:07 +00:00
|
|
|
requestArg: T['request']
|
|
|
|
) => Promise<T['response']>;
|
2019-08-25 15:19:12 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* typed handler for dealing with typed requests
|
|
|
|
*/
|
|
|
|
export class TypedHandler<T extends plugins.typedRequestInterfaces.ITypedRequest> {
|
|
|
|
public method: string;
|
|
|
|
private handlerFunction: THandlerFunction<T>;
|
|
|
|
|
|
|
|
constructor(methodArg: T['method'], handlerFunctionArg: THandlerFunction<T>) {
|
|
|
|
this.method = methodArg;
|
|
|
|
this.handlerFunction = handlerFunctionArg;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* adds a response to the typedRequest
|
|
|
|
* @param typedRequestArg
|
|
|
|
*/
|
|
|
|
public async addResponse(typedRequestArg: T) {
|
|
|
|
if (typedRequestArg.method !== this.method) {
|
2020-02-11 18:55:07 +00:00
|
|
|
throw new Error(
|
|
|
|
'this handler has been given a wrong method to answer to. Please use a TypedRouter to filter requests'
|
|
|
|
);
|
2019-08-25 15:19:12 +00:00
|
|
|
}
|
2020-06-16 15:03:10 +00:00
|
|
|
let typedResponseError: TypedResponseError;
|
2020-10-06 15:05:29 +00:00
|
|
|
const response = await this.handlerFunction(typedRequestArg.request).catch((e) => {
|
2020-06-16 15:03:10 +00:00
|
|
|
if (e instanceof TypedResponseError) {
|
|
|
|
typedResponseError = e;
|
|
|
|
} else {
|
|
|
|
throw e;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
if (typedResponseError) {
|
|
|
|
typedRequestArg.error = {
|
|
|
|
text: typedResponseError.errorText,
|
2020-10-06 15:05:29 +00:00
|
|
|
data: typedResponseError.errorData,
|
2020-06-16 15:03:10 +00:00
|
|
|
};
|
|
|
|
}
|
2020-06-25 23:53:05 +00:00
|
|
|
|
2020-06-16 15:03:10 +00:00
|
|
|
if (response) {
|
|
|
|
typedRequestArg.response = response;
|
|
|
|
}
|
|
|
|
|
2020-10-06 15:05:29 +00:00
|
|
|
typedRequestArg?.correlation?.phase ? (typedRequestArg.correlation.phase = 'response') : null;
|
2020-07-14 02:20:15 +00:00
|
|
|
|
2019-08-25 15:19:12 +00:00
|
|
|
return typedRequestArg;
|
|
|
|
}
|
|
|
|
}
|