in packages/fxa-auth-server/lib/error.js [108:184]
AppError.translate = function (request, response) {
let error;
if (response instanceof AppError) {
return response;
}
if (OauthError.isOauthRoute(request && request.route.path)) {
return OauthError.translate(response);
} else if (response instanceof OauthError) {
return appErrorFromOauthError(response);
}
const payload = response.output.payload;
const reason = response.reason;
if (!payload) {
error = AppError.unexpectedError(request);
} else if (
payload.statusCode === 500 &&
/(socket hang up|ECONNREFUSED)/.test(reason)
) {
// A connection to a remote service either was not made or timed out.
if (response instanceof Error) {
error = AppError.backendServiceFailure(
undefined,
undefined,
undefined,
response
);
} else {
error = AppError.backendServiceFailure();
}
} else if (payload.statusCode === 401) {
// These are common errors generated by Hawk auth lib.
if (
payload.message === 'Unknown credentials' ||
payload.message === 'Invalid credentials'
) {
error = AppError.invalidToken(
`Invalid authentication token: ${payload.message}`
);
} else if (payload.message === 'Stale timestamp') {
error = AppError.invalidTimestamp();
} else if (payload.message === 'Invalid nonce') {
error = AppError.invalidNonce();
} else if (BAD_SIGNATURE_ERRORS.indexOf(payload.message) !== -1) {
error = AppError.invalidSignature(payload.message);
} else {
error = AppError.invalidToken(
`Invalid authentication token: ${payload.message}`
);
}
} else if (payload.validation) {
if (payload.message?.includes('is required')) {
error = AppError.missingRequestParameter(payload.validation.keys[0]);
} else {
error = AppError.invalidRequestParameter(payload.validation);
}
} else if (payload.statusCode === 413 && TOO_LARGE.test(payload.message)) {
error = AppError.requestBodyTooLarge();
} else {
error = new AppError({
message: payload.message,
code: payload.statusCode,
error: payload.error,
errno: payload.errno,
info: payload.info,
stack: response.stack,
});
if (response.data) {
error.output.payload.data = JSON.stringify(response.data);
}
if (payload.statusCode >= 500) {
decorateErrorWithRequest(error, request);
}
}
return error;
};