@twitter-api-v2/plugin-rate-limit
Version:
Rate limit plugin for twitter-api-v2
118 lines (117 loc) • 4.11 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.TwitterApiRateLimitPluginWithPrefixV2 = exports.TwitterApiRateLimitPluginWithPrefixV1 = exports.TwitterApiRateLimitPluginWithPrefix = exports.TwitterApiRateLimitPlugin = void 0;
const memory_store_1 = require("./memory-store");
const prefixes = {
v2: 'https://api.twitter.com/2/',
v2Labs: 'https://api.twitter.com/labs/2/',
v1: 'https://api.twitter.com/1.1/',
v1Upload: 'https://upload.twitter.com/1.1/',
v1Stream: 'https://stream.twitter.com/1.1/',
};
// - Base plugin -
class TwitterApiRateLimitPlugin {
constructor(store) {
this.store = store || new memory_store_1.TwitterApiRateLimitMemoryStore();
}
async onAfterRequest(args) {
const rateLimit = args.response.rateLimit;
if (rateLimit) {
await this.store.set({
plugin: this,
endpoint: args.computedParams.rawUrl,
method: args.params.method.toUpperCase(),
rateLimit,
});
}
}
async onResponseError(args) {
const rateLimit = args.error.rateLimit;
if (rateLimit) {
await this.store.set({
plugin: this,
endpoint: args.computedParams.rawUrl,
method: args.params.method.toUpperCase(),
rateLimit,
});
}
}
/**
* Get the last obtained Twitter rate limit information for {endpoint}.
*/
getRateLimit(endpoint, method) {
return this.store.get({
plugin: this,
endpoint,
method,
});
}
/**
*
* Tells if you hit the Twitter rate limit for {rateLimit}.
* Obtain {rateLimit} through {.getRateLimit}.
*/
hasHitRateLimit(rateLimit) {
if (this.isRateLimitStatusObsolete(rateLimit)) {
return false;
}
return rateLimit.remaining === 0;
}
/**
* Tells if you hit the returned Twitter rate limit for the following {rateLimit} has expired.
* Obtain {rateLimit} through {.getRateLimit}.
*/
isRateLimitStatusObsolete(rateLimit) {
if (!rateLimit) {
return true;
}
// Timestamps are exprimed in seconds, JS works with ms
return (rateLimit.reset * 1000) < Date.now();
}
get v1() {
if (this._v1Plugin) {
return this._v1Plugin;
}
return this._v1Plugin = new TwitterApiRateLimitPluginWithPrefixV1(this, 'v1');
}
get v2() {
if (this._v2Plugin) {
return this._v2Plugin;
}
return this._v2Plugin = new TwitterApiRateLimitPluginWithPrefixV2(this, 'v2');
}
}
exports.TwitterApiRateLimitPlugin = TwitterApiRateLimitPlugin;
// - Extensions / Getters -
class TwitterApiRateLimitPluginWithPrefix {
constructor(plugin, prefix) {
this.plugin = plugin;
this.prefix = prefix;
}
getRateLimit(endpoint, method) {
return this.plugin.getRateLimit(prefixes[this.prefix] + endpoint, method);
}
hasHitRateLimit(rateLimit) {
return this.plugin.hasHitRateLimit(rateLimit);
}
isRateLimitStatusObsolete(rateLimit) {
return this.plugin.isRateLimitStatusObsolete(rateLimit);
}
}
exports.TwitterApiRateLimitPluginWithPrefix = TwitterApiRateLimitPluginWithPrefix;
class TwitterApiRateLimitPluginWithPrefixV1 extends TwitterApiRateLimitPluginWithPrefix {
get upload() {
return new TwitterApiRateLimitPluginWithPrefix(this.plugin, 'v1Upload');
}
get stream() {
return new TwitterApiRateLimitPluginWithPrefix(this.plugin, 'v1Stream');
}
}
exports.TwitterApiRateLimitPluginWithPrefixV1 = TwitterApiRateLimitPluginWithPrefixV1;
class TwitterApiRateLimitPluginWithPrefixV2 extends TwitterApiRateLimitPluginWithPrefix {
get labs() {
return new TwitterApiRateLimitPluginWithPrefix(this.plugin, 'v2Labs');
}
}
exports.TwitterApiRateLimitPluginWithPrefixV2 = TwitterApiRateLimitPluginWithPrefixV2;
exports.default = TwitterApiRateLimitPlugin;