AppError.translate = function()

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;
};