@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.
156 lines (155 loc) • 5.89 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.RequestParamHelpers = void 0;
const form_data_helper_1 = require("./form-data.helper");
const oauth1_helper_1 = __importDefault(require("./oauth1.helper"));
/* Helpers functions that are specific to this class but do not depends on instance */
class RequestParamHelpers {
static formatQueryToString(query) {
const formattedQuery = {};
for (const prop in query) {
if (typeof query[prop] === "string") {
formattedQuery[prop] = query[prop];
}
else if (typeof query[prop] !== "undefined") {
formattedQuery[prop] = String(query[prop]);
}
}
return formattedQuery;
}
static autoDetectBodyType(url) {
if (url.pathname.startsWith("/2/") || url.pathname.startsWith("/labs/2/")) {
// oauth2 takes url encoded
if (url.password.startsWith("/2/oauth2")) {
return "url";
}
// Twitter API v2 has JSON-encoded requests for everything else
return "json";
}
if (url.hostname === "upload.x.com") {
if (url.pathname === "/1.1/media/upload.json") {
return "form-data";
}
// json except for media/upload command, that is form-data.
return "json";
}
const endpoint = url.pathname.split("/1.1/", 2)[1];
if (this.JSON_1_1_ENDPOINTS.has(endpoint)) {
return "json";
}
return "url";
}
static addQueryParamsToUrl(url, query) {
const queryEntries = Object.entries(query);
if (queryEntries.length) {
let search = "";
for (const [key, value] of queryEntries) {
search +=
(search.length ? "&" : "?") +
`${oauth1_helper_1.default.percentEncode(key)}=${oauth1_helper_1.default.percentEncode(value)}`;
}
url.search = search;
}
}
static constructBodyParams(body, headers, mode) {
if (body instanceof Buffer) {
return body;
}
if (mode === "json") {
if (!headers["content-type"]) {
headers["content-type"] = "application/json;charset=UTF-8";
}
return JSON.stringify(body);
}
else if (mode === "url") {
if (!headers["content-type"]) {
headers["content-type"] =
"application/x-www-form-urlencoded;charset=UTF-8";
}
if (Object.keys(body).length) {
return new URLSearchParams(body).toString().replace(/\*/g, "%2A"); // URLSearchParams doesnt encode '*', but Twitter wants it encoded.
}
return "";
}
else if (mode === "raw") {
throw new Error("You can only use raw body mode with Buffers. To give a string, use Buffer.from(str).");
}
else {
const form = new form_data_helper_1.FormDataHelper();
for (const parameter in body) {
form.append(parameter, body[parameter]);
}
if (!headers["content-type"]) {
const formHeaders = form.getHeaders();
headers["content-type"] = formHeaders["content-type"];
}
return form.getBuffer();
}
}
static setBodyLengthHeader(options, body) {
var _a;
options.headers = (_a = options.headers) !== null && _a !== void 0 ? _a : {};
if (typeof body === "string") {
options.headers["content-length"] = Buffer.byteLength(body);
}
else {
options.headers["content-length"] = body.length;
}
}
static isOAuthSerializable(item) {
return !(item instanceof Buffer);
}
static mergeQueryAndBodyForOAuth(query, body) {
const parameters = {};
for (const prop in query) {
parameters[prop] = query[prop];
}
if (this.isOAuthSerializable(body)) {
for (const prop in body) {
const bodyProp = body[prop];
if (this.isOAuthSerializable(bodyProp)) {
parameters[prop] =
typeof bodyProp === "object" &&
bodyProp !== null &&
"toString" in bodyProp
? bodyProp.toString()
: bodyProp;
}
}
}
return parameters;
}
static moveUrlQueryParamsIntoObject(url, query) {
for (const [param, value] of url.searchParams) {
query[param] = value;
}
// Remove the query string
url.search = "";
return url;
}
/**
* Replace URL parameters available in pathname, like `:id`, with data given in `parameters`:
* `https://x.com/:id.json` + `{ id: '20' }` => `https://x.com/20.json`
*/
static applyRequestParametersToUrl(url, parameters) {
url.pathname = url.pathname.replace(/:([A-Z_-]+)/gi, (fullMatch, paramName) => {
if (parameters[paramName] !== undefined) {
return String(parameters[paramName]);
}
return fullMatch;
});
return url;
}
}
exports.RequestParamHelpers = RequestParamHelpers;
RequestParamHelpers.JSON_1_1_ENDPOINTS = new Set([
"direct_messages/events/new.json",
"direct_messages/welcome_messages/new.json",
"direct_messages/welcome_messages/rules/new.json",
"media/metadata/create.json",
"collections/entries/curate.json",
]);
exports.default = RequestParamHelpers;