Skip to content

Commit 19c6ce5

Browse files
author
Andrea Cosentino
committed
perf: gatewayTimeout logic
1 parent 996a2c2 commit 19c6ce5

1 file changed

Lines changed: 26 additions & 8 deletions

File tree

src/utils/plugin.ts

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -606,11 +606,31 @@ export const runPlugin = async (req: IncomingMessage, response: ServerResponse,
606606
try {
607607
const { gatewayTimeout, errorMiddlewares, noHandledRestFsRequestsAction: noHandledRequestsAction } = options;
608608
const { promise, reject, resolve } = Utils.plugin.promiseWithResolver<ApiWsRestFsDataResponse>();
609-
let gatewayIdTimeout: NodeJS.Timeout;
609+
610+
let settled = false;
611+
let gatewayIdTimeout: NodeJS.Timeout | undefined;
612+
613+
const settleResolve = (value: ApiWsRestFsDataResponse) => {
614+
if (settled) {
615+
return;
616+
}
617+
settled = true;
618+
clearTimeout(gatewayIdTimeout);
619+
resolve(value);
620+
};
621+
622+
const settleReject = (reason: unknown) => {
623+
if (settled) {
624+
return;
625+
}
626+
settled = true;
627+
clearTimeout(gatewayIdTimeout);
628+
reject(reason);
629+
};
610630

611631
if (gatewayTimeout !== 0) {
612632
gatewayIdTimeout = setTimeout(() => {
613-
resolve({
633+
settleResolve({
614634
status: Constants.HTTP_STATUS_CODE.GATEWAY_TIMEOUT,
615635
readFile: false,
616636
isError: true,
@@ -624,18 +644,16 @@ export const runPlugin = async (req: IncomingMessage, response: ServerResponse,
624644

625645
runPluginInternal(req, response, logger, options)
626646
.then(result => {
627-
clearTimeout(gatewayIdTimeout);
628647
const { status, data, headers } = result;
629-
resolve({
648+
settleResolve({
630649
status: status!,
631650
data,
632651
readFile: false,
633652
isError: false,
634653
headers
635654
});
636655
})
637-
.catch(async (error: UniversalApiError) => {
638-
clearTimeout(gatewayIdTimeout);
656+
.catch((error: UniversalApiError) => {
639657
const dataResponse: ApiWsRestFsDataResponse = {
640658
status: Constants.HTTP_STATUS_CODE.INTERNAL_SERVER_ERROR,
641659
data: error.message,
@@ -650,7 +668,7 @@ export const runPlugin = async (req: IncomingMessage, response: ServerResponse,
650668
switch (error.getType()) {
651669
case "NO_HANDLER":
652670
if (noHandledRequestsAction === "forward") {
653-
reject("next");
671+
settleReject("next");
654672
callReject = true;
655673
} else {
656674
dataResponse.status = Constants.HTTP_STATUS_CODE.NOT_FOUND;
@@ -682,7 +700,7 @@ export const runPlugin = async (req: IncomingMessage, response: ServerResponse,
682700
dataResponse.data = dataResponse.data ?? "Internal Server Error";
683701
break;
684702
}
685-
!callReject && resolve(dataResponse);
703+
!callReject && settleResolve(dataResponse);
686704
});
687705

688706
logger.debug(`runPlugin: awaiting runInternalPlugin execution`);

0 commit comments

Comments
 (0)