UNPKG

x-api-sdk-ts

Version:

TypeScript Library for the X (ex-twitter) API V2

164 lines 5.95 kB
"use strict"; 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