@@ -37,13 +37,50 @@ export class CoinbaseError extends Error {
37
37
}
38
38
39
39
function parseErrorResponse ( responseText : string ) : Record < string , any > {
40
+ if ( ! responseText ) {
41
+ return {
42
+ error : 'Empty response' ,
43
+ originalResponse : responseText
44
+ } ;
45
+ }
46
+
40
47
try {
41
48
return JSON . parse ( responseText ) ;
42
- } catch {
43
- return { } ;
49
+ } catch ( error ) {
50
+ // Create a more informative error object
51
+ return {
52
+ error : 'Invalid JSON response' ,
53
+ message : error instanceof Error ? error . message : 'Unknown parsing error' ,
54
+ originalResponse : responseText . slice ( 0 , 200 ) // Include first 200 chars to aid debugging
55
+ } ;
44
56
}
45
57
}
46
58
59
+ // Sanitize error messages to prevent sensitive information exposure
60
+ function sanitizeErrorMessage ( message : string ) : string {
61
+ // Remove potential sensitive patterns (API keys, tokens, credentials)
62
+ return message . replace ( / ( [ A - Z a - z 0 - 9 + / ] { 32 , } ) / g, '[REDACTED]' )
63
+ . replace ( / k e y - [ a - z A - Z 0 - 9 ] { 32 , } / g, '[REDACTED]' )
64
+ . replace ( / s k - [ a - z A - Z 0 - 9 ] { 32 , } / g, '[REDACTED]' )
65
+ . replace ( / \b [ A - Z a - z 0 - 9 . _ % + - ] + @ [ A - Z a - z 0 - 9 . - ] + \. [ A - Z a - z ] { 2 , } \b / g, '[REDACTED_EMAIL]' ) ;
66
+ }
67
+
68
+ function sanitizeErrorDetails ( details : Record < string , any > ) : Record < string , any > {
69
+ const sensitiveKeys = [ 'apiKey' , 'secret' , 'token' , 'password' , 'credential' , 'key' , 'auth' ] ;
70
+ return Object . entries ( details ) . reduce ( ( acc , [ key , value ] ) => {
71
+ if ( sensitiveKeys . some ( k => key . toLowerCase ( ) . includes ( k ) ) ) {
72
+ acc [ key ] = '[REDACTED]' ;
73
+ } else if ( typeof value === 'object' && value !== null ) {
74
+ acc [ key ] = sanitizeErrorDetails ( value ) ;
75
+ } else if ( typeof value === 'string' ) {
76
+ acc [ key ] = sanitizeErrorMessage ( value ) ;
77
+ } else {
78
+ acc [ key ] = value ;
79
+ }
80
+ return acc ;
81
+ } , { } as Record < string , any > ) ;
82
+ }
83
+
47
84
function getErrorDetails ( response : Response , responseText : string ) : CoinbaseErrorDetails {
48
85
const parsedError = parseErrorResponse ( responseText ) ;
49
86
const status = response . status ;
@@ -77,8 +114,8 @@ function getErrorDetails(response: Response, responseText: string): CoinbaseErro
77
114
if ( status === 400 ) {
78
115
return {
79
116
type : CoinbaseErrorType . VALIDATION ,
80
- message : parsedError . message || 'Invalid request parameters' ,
81
- details : parsedError ,
117
+ message : sanitizeErrorMessage ( parsedError . message || 'Invalid request parameters' ) ,
118
+ details : sanitizeErrorDetails ( parsedError ) ,
82
119
suggestion : 'Please verify all required parameters are provided and have valid values.'
83
120
} ;
84
121
}
@@ -104,9 +141,9 @@ function getErrorDetails(response: Response, responseText: string): CoinbaseErro
104
141
// Default unknown error
105
142
return {
106
143
type : CoinbaseErrorType . UNKNOWN ,
107
- message : `Unexpected error: ${ response . statusText } ` ,
108
- details : parsedError ,
109
- suggestion : 'If this persists, please contact team with the error details.'
144
+ message : sanitizeErrorMessage ( `Unexpected error: ${ response . statusText } ` ) ,
145
+ details : sanitizeErrorDetails ( parsedError ) ,
146
+ suggestion : 'If this persists, please contact support with the error details.'
110
147
} ;
111
148
}
112
149
@@ -118,6 +155,11 @@ export function handleException(
118
155
if ( ( 400 <= response . status && response . status <= 499 ) ||
119
156
( 500 <= response . status && response . status <= 599 ) ) {
120
157
const errorDetails = getErrorDetails ( response , responseText ) ;
158
+ // Sanitize any additional error information
159
+ errorDetails . message = sanitizeErrorMessage ( errorDetails . message ) ;
160
+ if ( errorDetails . details ) {
161
+ errorDetails . details = sanitizeErrorDetails ( errorDetails . details ) ;
162
+ }
121
163
throw new CoinbaseError ( errorDetails , response . status , response ) ;
122
164
}
123
165
}
0 commit comments