@@ -2,16 +2,17 @@ import path from "node:path";
22import dotenv from "dotenv" ;
33import express from "express" ;
44
5- import { Quote , QuoteRequest , SwapperError , SwapQuoteData } from "@gemwallet/types" ;
6- import { StonfiProvider , Protocol , MayanProvider , CetusAggregatorProvider , RelayProvider , OrcaWhirlpoolProvider , PanoraProvider } from "@gemwallet/swapper" ;
5+ import { Quote , QuoteRequest , SwapQuoteData } from "@gemwallet/types" ;
6+ import { StonfiProvider , Protocol , MayanProvider , CetusAggregatorProvider , RelayProvider , OrcaWhirlpoolProvider , PanoraProvider , SwapperException } from "@gemwallet/swapper" ;
77import versionInfo from "./version.json" ;
8+ import { errorResponse , sendErrorResponse , ProxyErrorResponse } from "./error" ;
89
910if ( process . env . NODE_ENV !== "production" ) {
1011 const rootEnvPath = path . resolve ( __dirname , "../../.." , ".env" ) ;
1112 dotenv . config ( { path : rootEnvPath , override : false } ) ;
1213}
1314
14- type ProxyResponse < T > = { ok : T } | { err : SwapperError } | { error : string } ;
15+ type ProxyResponse < T > = { ok : T } | ProxyErrorResponse ;
1516type ProviderRequest = express . Request & { provider ?: Protocol ; objectResponse ?: boolean } ;
1617
1718const app = express ( ) ;
@@ -60,7 +61,10 @@ app.post("/:providerId/quote", withProvider, async (req: ProviderRequest, res) =
6061 console . error ( "Error fetching quote via POST:" , error ) ;
6162 console . debug ( "Request metadata:" , { providerId : req . params . providerId , hasBody : Boolean ( req . body ) } ) ;
6263 }
63- res . status ( 500 ) . json ( errorResponse ( { type : "compute_quote_error" , message : "" } , error , objectResponse ) ) ;
64+ const swapperError = SwapperException . isSwapperException ( error )
65+ ? error . swapperError
66+ : { type : "compute_quote_error" as const , message : "" } ;
67+ sendErrorResponse ( res , swapperError , error , objectResponse ) ;
6468 }
6569} ) ;
6670
@@ -70,7 +74,6 @@ app.post("/:providerId/quote_data", withProvider, async (req: ProviderRequest, r
7074 const quote_request = req . body as Quote ;
7175
7276 try {
73-
7477 const quote = await provider . get_quote_data ( quote_request ) ;
7578 if ( objectResponse ) {
7679 res . json ( { ok : quote } satisfies ProxyResponse < SwapQuoteData > ) ;
@@ -82,40 +85,22 @@ app.post("/:providerId/quote_data", withProvider, async (req: ProviderRequest, r
8285 console . error ( "Error fetching quote data:" , error ) ;
8386 console . debug ( "Quote metadata:" , { providerId : req . params . providerId , hasQuote : Boolean ( quote_request ) } ) ;
8487 }
85- res . status ( 500 ) . json ( errorResponse ( { type : "transaction_error" , message : "" } , error , objectResponse ) ) ;
88+ const swapperError = SwapperException . isSwapperException ( error )
89+ ? error . swapperError
90+ : { type : "transaction_error" as const , message : "" } ;
91+ sendErrorResponse ( res , swapperError , error , objectResponse ) ;
8692 }
8793} ) ;
8894
8995app . listen ( PORT , ( ) => {
9096 console . log ( `swapper api is running on port ${ PORT } .` ) ;
9197} ) ;
9298
93- function errorResponse ( err : SwapperError , rawError : unknown , structured : boolean ) : ProxyResponse < never > {
94- const message = extractMessage ( rawError ) ?? ( "message" in err ? err . message : undefined ) ;
95- if ( ! structured ) {
96- return { error : message ?? "Unknown error occurred" } ;
97- }
98- if ( isMessageError ( err ) ) {
99- return { err : { ...err , message : message ?? err . message ?? "" } } ;
100- }
101- return { err } ;
102- }
103-
10499function parseVersion ( raw : unknown ) : number {
105100 const num = typeof raw === "string" ? Number ( raw ) : Array . isArray ( raw ) ? Number ( raw [ 0 ] ) : NaN ;
106101 return Number . isFinite ( num ) ? num : 0 ;
107102}
108103
109- function extractMessage ( error : unknown ) : string | undefined {
110- if ( error instanceof Error ) return error . message ;
111- if ( typeof error === "string" ) return error ;
112- return undefined ;
113- }
114-
115- function isMessageError ( err : SwapperError ) : err is Extract < SwapperError , { message : string } > {
116- return err . type === "compute_quote_error" || err . type === "transaction_error" ;
117- }
118-
119104function withProvider ( req : ProviderRequest , res : express . Response , next : express . NextFunction ) {
120105 const providerId = req . params . providerId as string ;
121106 const provider = providers [ providerId ] ;
0 commit comments