A suite to track Project Diva score statistics and ratings / D4DJ event data.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
projectdivar/server/node_modules/twitter-autohook/errors/index.js

71 lines
2.4 KiB

4 years ago
class TwitterError extends Error {
constructor({body, statusCode = null}, message = null, code = null) {
if (message === null && code === null && Array.isArray(body.errors)) {
message = body.errors[0].message;
code = body.errors[0].code;
}
super(`${message}` + (code ? ` (HTTP status: ${statusCode}, Twitter code: ${code})` : ''));
this.name = this.constructor.name;
this.code = code;
Error.captureStackTrace(this, this.constructor);
}
}
class WebhookURIError extends TwitterError {}
class UserSubscriptionError extends TwitterError {}
class RateLimitError extends Error {
constructor({body, req = {}, headers = {}, statusCode = null}, message = null, code = null) {
if (message === null && code === null && Array.isArray(body.errors)) {
message = body.errors[0].message;
code = body.errors[0].code;
}
if (typeof headers !== 'undefined' && typeof headers['x-rate-limit-limit'] !== 'undefined' && typeof headers['x-rate-limit-reset'] !== 'undefined') {
const requestAllowed = headers['x-rate-limit-limit'];
const resetAt = headers['x-rate-limit-reset'] * 1000 - (new Date().getTime());
const resetAtMin = Math.round(resetAt / 60 / 1000);
super(`You exceeded the rate limit for ${req.path} (${requestAllowed} requests available, 0 remaining). Wait ${resetAtMin} minutes before trying again.`);
} else {
super(`You exceeded the rate limit for ${req.path}. Wait until rate limit resets and try again.`);
}
this.resetAt = headers['x-rate-limit-reset'] * 1000;
this.name = this.constructor.name;
this.code = code;
Error.captureStackTrace(this, this.constructor);
}
}
class TooManySubscriptionsError extends TwitterError {}
class AuthenticationError extends TwitterError {}
class BearerTokenError extends TwitterError {}
const tryError = (response, defaultError = (response) => new TwitterError(response)) => {
switch (response.statusCode) {
case 200:
case 201:
case 204:
return false;
case 400:
case 401:
case 403:
throw new AuthenticationError(response);
case 420:
case 429:
throw new RateLimitError(response);
default:
throw defaultError(response);
}
};
module.exports = {
TwitterError,
WebhookURIError,
UserSubscriptionError,
TooManySubscriptionsError,
RateLimitError,
AuthenticationError,
BearerTokenError,
tryError,
};