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