UNPKG

@twitter-api-v2/plugin-rate-limit

Version:
118 lines (117 loc) 4.11 kB
"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;