structures/errors.js

/**
 * @external Headers
 * @see {@link https://github.com/bitinn/node-fetch/blob/master/src/headers.js}
 */

class Ratelimit extends Error {
	/**
	 * @param {Headers} headers
	 * @param {string} endpoint
	 */
	constructor(headers, endpoint) {
		super();
		Error.captureStackTrace(this, Ratelimit);

		// It has to be like this, otherwise the error output emits an object >:( (Enumerability)
		Object.defineProperties(this, {
			name: {
				value: 'Ratelimit',
			},
			headers: {
				value: headers,
			},
			message: {
				value: `Endpoint /v${endpoint} Ratelimited, ${this.limit} times per ${this.retryAfter} second${this.retryAfter === 1 ? '' : 's'}`,
			}
		});
	}

	get limit() {
		return parseInt(this.headers.get('x-ratelimit-limit'));
	}

	get retryAfter() {
		return parseInt(this.headers.get('retry-after'));
	}

	toString() {
		return this.messages.split(' ')[1];
	}
}

class FetchError extends Error {
	constructor(i, message) {
		super(`${i.status} ${message}`);
		Object.defineProperty(this, 'name', { value: 'FetchError' });
		if (Error.captureStackTrace) Error.captureStackTrace(this, FetchError);
	}

	toString() {
		return this.message;
	}
}

exports.FetchError = FetchError;
exports.Ratelimit = Ratelimit;