@@ -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