47 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			47 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
// @ts-check
 | 
						|
 | 
						|
/**
 | 
						|
 * Typed as a string because otherwise it's a const string, which means we can't
 | 
						|
 * override it in let statements.
 | 
						|
 * @type {string}
 | 
						|
 */
 | 
						|
export const UNEXPECTED_ERROR_MESSAGE = 'An unexpected error occurred';
 | 
						|
 | 
						|
/**
 | 
						|
 * Extracts the status and message properties from the error object, if
 | 
						|
 * available for public use. The `unknown` is for catch statements
 | 
						|
 * @param {Error | AuthenticationError | RequestError | unknown} err
 | 
						|
 */
 | 
						|
export function extractStatusAndMessage(err) {
 | 
						|
  let statusCode = 500;
 | 
						|
  let errorMessage = UNEXPECTED_ERROR_MESSAGE;
 | 
						|
  if (err instanceof AuthenticationError || err instanceof RequestError) {
 | 
						|
    statusCode = err.status;
 | 
						|
    errorMessage = err.message;
 | 
						|
  }
 | 
						|
 | 
						|
  return { statusCode, errorMessage };
 | 
						|
}
 | 
						|
 | 
						|
export class RequestError extends Error {
 | 
						|
  /**
 | 
						|
   * @param {string} message
 | 
						|
   */
 | 
						|
  constructor(message) {
 | 
						|
    super(message);
 | 
						|
    this.name = "RequestError";
 | 
						|
    this.status = 400;
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
export class AuthenticationError extends Error {
 | 
						|
  /**
 | 
						|
   * @param {string} message
 | 
						|
   */
 | 
						|
  constructor(message) {
 | 
						|
    super(message);
 | 
						|
    this.name = "AuthenticationError";
 | 
						|
    this.status = 401;
 | 
						|
  }
 | 
						|
}
 |