@virtuals-protocol/game-twitter-node
Version:
Strongly typed, full-featured, light, versatile yet powerful Virtual Twitter API v2 client for Node.js. Forked from twitter-api-v2.
204 lines (203 loc) • 7.14 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const request_maker_mixin_1 = require("./client-mixins/request-maker.mixin");
const helpers_1 = require("./helpers");
const globals_1 = require("./globals");
/**
* Base class for Twitter instances
*/
class TwitterApiBase {
constructor(token, settings = {}) {
this._currentUser = null;
this._currentUserV2 = null;
if (token instanceof TwitterApiBase) {
this._requestMaker = token._requestMaker;
}
else {
this._requestMaker = new request_maker_mixin_1.ClientRequestMaker(settings);
this._requestMaker.initializeToken(token);
}
}
/* Prefix/Token handling */
setPrefix(prefix) {
this._prefix = prefix;
}
cloneWithPrefix(prefix) {
const clone = this.constructor(this);
clone.setPrefix(prefix);
return clone;
}
getActiveTokens() {
return this._requestMaker.getActiveTokens();
}
/* Rate limit cache / Plugins */
getPlugins() {
return this._requestMaker.getPlugins();
}
getPluginOfType(type) {
return this.getPlugins().find((plugin) => plugin instanceof type);
}
/**
* @deprecated - Migrate to plugin `@twitter-api-v2/plugin-rate-limit`
*
* Tells if you hit the Twitter rate limit for {endpoint}.
* (local data only, this should not ask anything to Twitter)
*/
hasHitRateLimit(endpoint) {
var _a;
if (this.isRateLimitStatusObsolete(endpoint)) {
return false;
}
return ((_a = this.getLastRateLimitStatus(endpoint)) === null || _a === void 0 ? void 0 : _a.remaining) === 0;
}
/**
* @deprecated - Migrate to plugin `@twitter-api-v2/plugin-rate-limit`
*
* Tells if you hit the returned Twitter rate limit for {endpoint} has expired.
* If client has no saved rate limit data for {endpoint}, this will gives you `true`.
*/
isRateLimitStatusObsolete(endpoint) {
const rateLimit = this.getLastRateLimitStatus(endpoint);
if (rateLimit === undefined) {
return true;
}
// Timestamps are exprimed in seconds, JS works with ms
return rateLimit.reset * 1000 < Date.now();
}
/**
* @deprecated - Migrate to plugin `@twitter-api-v2/plugin-rate-limit`
*
* Get the last obtained Twitter rate limit information for {endpoint}.
* (local data only, this should not ask anything to Twitter)
*/
getLastRateLimitStatus(endpoint) {
const endpointWithPrefix = endpoint.match(/^https?:\/\//)
? endpoint
: this._prefix + endpoint;
return this._requestMaker.getRateLimits()[endpointWithPrefix];
}
/* Current user cache */
/** Get cached current user. */
getCurrentUserObject(forceFetch = false) {
if (!forceFetch && this._currentUser) {
if (this._currentUser.value) {
return Promise.resolve(this._currentUser.value);
}
return this._currentUser.promise;
}
this._currentUser = (0, helpers_1.sharedPromise)(() => this.get("account/verify_credentials.json", { tweet_mode: "extended" }, { prefix: globals_1.API_V1_1_PREFIX }));
return this._currentUser.promise;
}
/**
* Get cached current user from v2 API.
* This can only be the slimest available `UserV2` object, with only `id`, `name` and `username` properties defined.
*
* To get a customized `UserV2Result`, use `.v2.me()`
*
* OAuth2 scopes: `tweet.read` & `users.read`
*/
getCurrentUserV2Object(forceFetch = false) {
if (!forceFetch && this._currentUserV2) {
if (this._currentUserV2.value) {
return Promise.resolve(this._currentUserV2.value);
}
return this._currentUserV2.promise;
}
this._currentUserV2 = (0, helpers_1.sharedPromise)(() => this.get("users/me", undefined, {
prefix: this._requestMaker.gameTwitterAccessToken
? globals_1.GAME_API_V2_PREFIX
: globals_1.API_V2_PREFIX,
}));
return this._currentUserV2.promise;
}
async get(url, query = {}, { fullResponse, prefix = this._prefix, ...rest } = {}) {
if (prefix)
url = prefix + url;
const resp = await this._requestMaker.send({
url,
method: "GET",
query,
...rest,
});
return fullResponse ? resp : resp.data;
}
async delete(url, query = {}, { fullResponse, prefix = this._prefix, ...rest } = {}) {
if (prefix)
url = prefix + url;
const resp = await this._requestMaker.send({
url,
method: "DELETE",
query,
...rest,
});
return fullResponse ? resp : resp.data;
}
async post(url, body, { fullResponse, prefix = this._prefix, ...rest } = {}) {
if (prefix)
url = prefix + url;
const resp = await this._requestMaker.send({
url,
method: "POST",
body,
...rest,
});
return fullResponse ? resp : resp.data;
}
async postFormDataGame(url, body) {
if (!this._requestMaker.gameTwitterAccessToken) {
throw new Error("Game Twitter access token is not set");
}
url = globals_1.GAME_API_V2_PREFIX + url;
const response = await fetch(url, {
method: "POST",
body,
headers: {
"x-api-key": this._requestMaker.gameTwitterAccessToken,
},
});
if (!response.ok) {
const errorText = await response.text();
throw new Error(`Error: ${response.status} ${response.statusText}\n${errorText}`);
}
return response.json();
}
async put(url, body, { fullResponse, prefix = this._prefix, ...rest } = {}) {
if (prefix)
url = prefix + url;
const resp = await this._requestMaker.send({
url,
method: "PUT",
body,
...rest,
});
return fullResponse ? resp : resp.data;
}
async patch(url, body, { fullResponse, prefix = this._prefix, ...rest } = {}) {
if (prefix)
url = prefix + url;
const resp = await this._requestMaker.send({
url,
method: "PATCH",
body,
...rest,
});
return fullResponse ? resp : resp.data;
}
getStream(url, query, { prefix = this._prefix, ...rest } = {}) {
return this._requestMaker.sendStream({
url: prefix ? prefix + url : url,
method: "GET",
query,
...rest,
});
}
postStream(url, body, { prefix = this._prefix, ...rest } = {}) {
return this._requestMaker.sendStream({
url: prefix ? prefix + url : url,
method: "POST",
body,
...rest,
});
}
}
exports.default = TwitterApiBase;