@@ -96,6 +96,7 @@ export const pingGatewayAndVerify = async ({
96
96
error : err as Error
97
97
} ) ;
98
98
} ) ;
99
+
99
100
for ( let attempt = 1 ; attempt <= maxRetries ; attempt += 1 ) {
100
101
try {
101
102
const stream = quicClient . connection . newStream ( "bidi" ) ;
@@ -108,17 +109,13 @@ export const pingGatewayAndVerify = async ({
108
109
const { value, done } = await reader . read ( ) ;
109
110
110
111
if ( done ) {
111
- throw new BadRequestError ( {
112
- message : "Gateway closed before receiving PONG"
113
- } ) ;
112
+ throw new Error ( "Gateway closed before receiving PONG" ) ;
114
113
}
115
114
116
115
const response = Buffer . from ( value ) . toString ( ) ;
117
116
118
117
if ( response !== "PONG\n" && response !== "PONG" ) {
119
- throw new BadRequestError ( {
120
- message : `Failed to Ping. Unexpected response: ${ response } `
121
- } ) ;
118
+ throw new Error ( `Failed to Ping. Unexpected response: ${ response } ` ) ;
122
119
}
123
120
124
121
reader . releaseLock ( ) ;
@@ -146,6 +143,7 @@ interface TProxyServer {
146
143
server : net . Server ;
147
144
port : number ;
148
145
cleanup : ( ) => Promise < void > ;
146
+ getProxyError : ( ) => string ;
149
147
}
150
148
151
149
const setupProxyServer = async ( {
@@ -170,6 +168,7 @@ const setupProxyServer = async ({
170
168
error : err as Error
171
169
} ) ;
172
170
} ) ;
171
+ const proxyErrorMsg = [ "" ] ;
173
172
174
173
return new Promise ( ( resolve , reject ) => {
175
174
const server = net . createServer ( ) ;
@@ -185,31 +184,33 @@ const setupProxyServer = async ({
185
184
const forwardWriter = stream . writable . getWriter ( ) ;
186
185
await forwardWriter . write ( Buffer . from ( `FORWARD-TCP ${ targetHost } :${ targetPort } \n` ) ) ;
187
186
forwardWriter . releaseLock ( ) ;
188
- /* eslint-disable @typescript-eslint/no-misused-promises */
187
+
189
188
// Set up bidirectional copy
190
- const setupCopy = async ( ) => {
189
+ const setupCopy = ( ) => {
191
190
// Client to QUIC
192
191
// eslint-disable-next-line
193
192
( async ( ) => {
194
- try {
195
- const writer = stream . writable . getWriter ( ) ;
193
+ const writer = stream . writable . getWriter ( ) ;
196
194
197
- // Create a handler for client data
198
- clientConn . on ( "data" , async ( chunk ) => {
199
- await writer . write ( chunk ) ;
195
+ // Create a handler for client data
196
+ clientConn . on ( "data" , ( chunk ) => {
197
+ writer . write ( chunk ) . catch ( ( err ) => {
198
+ proxyErrorMsg . push ( ( err as Error ) ?. message ) ;
200
199
} ) ;
200
+ } ) ;
201
201
202
- // Handle client connection close
203
- clientConn . on ( "end" , async ( ) => {
204
- await writer . close ( ) ;
202
+ // Handle client connection close
203
+ clientConn . on ( "end" , ( ) => {
204
+ writer . close ( ) . catch ( ( err ) => {
205
+ logger . error ( err ) ;
205
206
} ) ;
207
+ } ) ;
206
208
207
- clientConn . on ( "error" , async ( err ) => {
208
- await writer . abort ( err ) ;
209
+ clientConn . on ( "error" , ( clientConnErr ) => {
210
+ writer . abort ( clientConnErr ?. message ) . catch ( ( err ) => {
211
+ proxyErrorMsg . push ( ( err as Error ) ?. message ) ;
209
212
} ) ;
210
- } catch ( err ) {
211
- clientConn . destroy ( ) ;
212
- }
213
+ } ) ;
213
214
} ) ( ) ;
214
215
215
216
// QUIC to Client
@@ -238,29 +239,37 @@ const setupProxyServer = async ({
238
239
}
239
240
}
240
241
} catch ( err ) {
242
+ proxyErrorMsg . push ( ( err as Error ) ?. message ) ;
241
243
clientConn . destroy ( ) ;
242
244
}
243
245
} ) ( ) ;
244
246
} ;
245
- await setupCopy ( ) ;
246
- //
247
+
248
+ setupCopy ( ) ;
247
249
// Handle connection closure
248
- clientConn . on ( "close" , async ( ) => {
249
- await stream . destroy ( ) ;
250
+ clientConn . on ( "close" , ( ) => {
251
+ stream . destroy ( ) . catch ( ( err ) => {
252
+ proxyErrorMsg . push ( ( err as Error ) ?. message ) ;
253
+ } ) ;
250
254
} ) ;
251
255
252
256
const cleanup = async ( ) => {
253
257
clientConn ?. destroy ( ) ;
254
258
await stream . destroy ( ) ;
255
259
} ;
256
260
257
- clientConn . on ( "error" , ( err ) => {
258
- logger . error ( err , "Client socket error" ) ;
259
- void cleanup ( ) ;
260
- reject ( err ) ;
261
+ clientConn . on ( "error" , ( clientConnErr ) => {
262
+ logger . error ( clientConnErr , "Client socket error" ) ;
263
+ cleanup ( ) . catch ( ( err ) => {
264
+ logger . error ( err , "Client conn cleanup" ) ;
265
+ } ) ;
261
266
} ) ;
262
267
263
- clientConn . on ( "end" , cleanup ) ;
268
+ clientConn . on ( "end" , ( ) => {
269
+ cleanup ( ) . catch ( ( err ) => {
270
+ logger . error ( err , "Client conn end" ) ;
271
+ } ) ;
272
+ } ) ;
264
273
} catch ( err ) {
265
274
logger . error ( err , "Failed to establish target connection:" ) ;
266
275
clientConn . end ( ) ;
@@ -272,12 +281,12 @@ const setupProxyServer = async ({
272
281
reject ( err ) ;
273
282
} ) ;
274
283
275
- server . on ( "close" , async ( ) => {
276
- await quicClient ?. destroy ( ) ;
284
+ server . on ( "close" , ( ) => {
285
+ quicClient ?. destroy ( ) . catch ( ( err ) => {
286
+ logger . error ( err , "Failed to destroy quic client" ) ;
287
+ } ) ;
277
288
} ) ;
278
289
279
- /* eslint-enable */
280
-
281
290
server . listen ( 0 , ( ) => {
282
291
const address = server . address ( ) ;
283
292
if ( ! address || typeof address === "string" ) {
@@ -293,7 +302,8 @@ const setupProxyServer = async ({
293
302
cleanup : async ( ) => {
294
303
server . close ( ) ;
295
304
await quicClient ?. destroy ( ) ;
296
- }
305
+ } ,
306
+ getProxyError : ( ) => proxyErrorMsg . join ( "," )
297
307
} ) ;
298
308
} ) ;
299
309
} ) ;
@@ -316,7 +326,7 @@ export const withGatewayProxy = async (
316
326
const { relayHost, relayPort, targetHost, targetPort, tlsOptions, identityId, orgId } = options ;
317
327
318
328
// Setup the proxy server
319
- const { port, cleanup } = await setupProxyServer ( {
329
+ const { port, cleanup, getProxyError } = await setupProxyServer ( {
320
330
targetHost,
321
331
targetPort,
322
332
relayPort,
@@ -330,8 +340,12 @@ export const withGatewayProxy = async (
330
340
// Execute the callback with the allocated port
331
341
await callback ( port ) ;
332
342
} catch ( err ) {
333
- logger . error ( err , "Failed to proxy" ) ;
334
- throw new BadRequestError ( { message : ( err as Error ) ?. message } ) ;
343
+ const proxyErrorMessage = getProxyError ( ) ;
344
+ if ( proxyErrorMessage ) {
345
+ logger . error ( new Error ( proxyErrorMessage ) , "Failed to proxy" ) ;
346
+ }
347
+ logger . error ( err , "Failed to do gateway" ) ;
348
+ throw new BadRequestError ( { message : proxyErrorMessage || ( err as Error ) ?. message } ) ;
335
349
} finally {
336
350
// Ensure cleanup happens regardless of success or failure
337
351
await cleanup ( ) ;
0 commit comments