x-api-sdk-ts
Version:
TypeScript Library for the X (ex-twitter) API V2
164 lines • 5.95 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.RequestClient = void 0;
const error_1 = require("./error");
const rate_limit_1 = require("./rate-limit");
const IRequestClient_1 = require("../interfaces/IRequestClient");
class RequestClient extends IRequestClient_1.AbstractRequestClient {
async get(url, params, headers) {
return this.request({
method: 'GET',
url,
params,
headers
});
}
async post(url, body, headers, params, contentType = 'application/json') {
return this.request({
method: 'POST',
url,
body,
headers,
params,
contentType
});
}
async put(url, body, headers, params) {
return this.request({
method: 'PUT',
url,
body,
headers,
params,
contentType: 'application/json'
});
}
async delete(url, headers, params) {
return this.request({
method: 'DELETE',
url,
headers,
params
});
}
async patch(url, body, headers, params) {
return this.request({
method: 'PATCH',
url,
body,
headers,
params,
contentType: 'application/json'
});
}
async request(options) {
try {
const url = this.buildUrl(options.url, options.params);
const fetchOptions = {
method: options.method,
headers: options.headers || {},
credentials: options.withCredentials ? 'include' : 'same-origin'
};
if (options.body) {
if (options.body instanceof FormData) {
fetchOptions.body = options.body;
}
else if (options.contentType === 'application/json') {
fetchOptions.body = JSON.stringify(options.body);
fetchOptions.headers['Content-Type'] = 'application/json';
}
else if (options.contentType === 'application/x-www-form-urlencoded') {
fetchOptions.body = this.buildFormData(options.body).toString();
fetchOptions.headers['Content-Type'] = 'application/x-www-form-urlencoded';
}
else if (options.contentType === 'multipart/form-data') {
fetchOptions.body = this.buildFormData(options.body, true);
}
else {
fetchOptions.body = options.body;
}
}
const response = await this.httpAdapter.fetch(url, fetchOptions);
return this.parseResponse(response);
}
catch (error) {
throw (0, error_1.parseTwitterError)(error);
}
}
async parseResponse(response) {
var _a, _b;
let data = null;
if (((_a = response.headers.get('Content-Type')) === null || _a === void 0 ? void 0 : _a.startsWith('application/json')) ||
((_b = response.headers.get('Content-Type')) === null || _b === void 0 ? void 0 : _b.startsWith('application/problem+json'))) {
data = await response.json();
}
else {
data = await response.text();
}
return {
data,
ok: response.ok,
status: response.status,
headers: response.headers,
rateLimitInfo: (0, rate_limit_1.parseRateLimitHeaders)(response.headers)
};
}
buildUrl(baseUrl, params) {
if (!params) {
return baseUrl;
}
const url = new URL(baseUrl);
Object.entries(params).forEach(([key, value]) => {
if (value !== undefined && value !== null) {
url.searchParams.append(key, value.toString());
}
});
return url.toString();
}
buildFormData(params, useFormData = false) {
if (useFormData) {
const formData = new FormData();
Object.entries(params).forEach(([key, value]) => {
if (value !== undefined && value !== null) {
if (Array.isArray(value)) {
value.forEach((item) => formData.append(key, item));
}
else if (value instanceof Blob) {
formData.append(key, value);
}
else if (typeof value === 'object' && value.constructor === Object) {
formData.append(key, JSON.stringify(value));
}
else {
formData.append(key, value.toString());
}
}
});
return formData;
}
else {
const urlSearchParams = new URLSearchParams();
Object.entries(params).forEach(([key, value]) => {
if (value !== undefined && value !== null) {
if (Array.isArray(value)) {
value.forEach((item) => {
urlSearchParams.append(key, item.toString());
});
}
else if (value instanceof Blob) {
console.warn(`Skipping Blob value for key '${key}' in URLSearchParams`);
}
else if (typeof value === 'object') {
urlSearchParams.append(key, JSON.stringify(value));
}
else {
urlSearchParams.append(key, value.toString());
}
}
});
return urlSearchParams;
}
}
}
exports.RequestClient = RequestClient;
//# sourceMappingURL=request.js.map