structures/errors/Ratelimit.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 in here, otherwise the error output emits an object >:(
		Object.defineProperties(this, {
			/**
		 	 * The Ratelimit Name ('Ratelimit')
			 * @name Ratelimit#name
			 * @readonly
			 * @type {string}
			 */
			name: {
				value: 'Ratelimit',
			},
			/**
			 * The Ratelimit Headers.
			 * @name Ratelimit#headers
			 * @readonly
			 * @type {Headers}
			 */
			headers: {
				value: headers,
			},
			/**
			 * The Ratelimit Message.
			 * @name Ratelimit#message
			 * @readonly
			 * @type {string}
			 */
			message: {
				value: `Endpoint /v${endpoint} Ratelimited, ${this.limit} times per ${this.retryAfter} second${this.retryAfter === 1 ? '' : 's'}`,
			}
		});
	}

	/**
	 * The number of times you can call an endpoint before you get ratelimited.
	 * @type {number}
	 */
	get limit() {
		return parseInt(this.headers.get('x-ratelimit-limit'));
	}

	/**
	 * The number of seconds you can wait until the Ratelimit is relieved.
	 * @type {number}
	 */
	get retryAfter() {
		return parseInt(this.headers.get('retry-after'));
	}

	/**
	 * The endpoint of the Ratelimit.
	 * @type {string}
	 */
	toString() {
		return this.messages.split(' ')[1];
	}
}

module.exports = Ratelimit;