cookie-pusher
Version:
Cookie-aware HTTP client based on axios and tough-cookie
74 lines (73 loc) • 4.05 kB
JavaScript
import { AxiosError } from "./exceptions";
import uiTexts_ from "./ui-texts.config";
const uiTexts = uiTexts_[`/client`];
import defaultHttpHeaders from "./default-http-headers.config";
import axios from "axios";
import toughCookie from "tough-cookie";
import neverThrow from "neverthrow";
export const Cookie = toughCookie.Cookie;
const getDefaultRequestHeaders = () => {
const numOfUserAgents = defaultHttpHeaders.httpHeaderOptions[`User-Agent`].length;
const randomIndex1 = Math.floor(Math.random() * numOfUserAgents);
const numOfAcceptLanguages = defaultHttpHeaders.httpHeaderOptions[`Accept-Language`].length;
const randomIndex2 = Math.floor(Math.random() * numOfAcceptLanguages);
return {
"User-Agent": defaultHttpHeaders.httpHeaderOptions[`User-Agent`][randomIndex1],
"Accept-Language": defaultHttpHeaders.httpHeaderOptions[`Accept-Language`][randomIndex2],
Connection: `keep-alive`,
};
};
export class Client {
constructor({ userAgent, acceptLanguage, } = {}) {
this.defaultHeaders = getDefaultRequestHeaders();
this.lastUrls = [];
this.cookies = new toughCookie.CookieJar();
this.setLanguage = (language) => {
this.defaultHeaders[`Accept-Language`] =
defaultHttpHeaders.languageToAcceptLanguageStringMap[language];
};
this.access = (config) => {
var _a, _b, _c;
const url = config.baseURL !== undefined
? new URL(config.url, config.baseURL)
: new URL(config.url, this.lastUrls[this.lastUrls.length - 1]);
this.lastUrls.push(url);
const unmodifiedCookieString = this.cookies.getCookieStringSync(url.href);
const isUndefinedOrEmpty = (cookieString) => cookieString === undefined || cookieString === ``;
const cookieString = isUndefinedOrEmpty(unmodifiedCookieString)
? isUndefinedOrEmpty((_a = config.headers) === null || _a === void 0 ? void 0 : _a.Cookie)
? undefined
: (_b = config.headers) === null || _b === void 0 ? void 0 : _b.Cookie
: isUndefinedOrEmpty((_c = config.headers) === null || _c === void 0 ? void 0 : _c.Cookie)
? unmodifiedCookieString
: `${config.headers.Cookie}; ${unmodifiedCookieString}`;
const cookieHeader = cookieString === undefined ? {} : { Cookie: cookieString };
const refererHeader = this.setReferer === undefined
? {}
: { Referer: this.setReferer(config, this).href };
const newConfig = Object.assign(Object.assign({ validateStatus: (statusCode) => statusCode >= 200 && statusCode < 400, maxRedirects: 0 }, config), { headers: Object.assign(Object.assign(Object.assign(Object.assign({}, this.defaultHeaders), refererHeader), config.headers), cookieHeader), url: url.href });
delete newConfig.baseURL;
const response = axios(newConfig);
return neverThrow.ResultAsync.fromPromise(response, (error) => new AxiosError(uiTexts[`axiosRequestError`], error)).andThen((response) => {
const setCookies = response.headers[`set-cookie`];
if (Array.isArray(setCookies)) {
setCookies.forEach((cookie) => this.cookies.setCookieSync(cookie, url.href));
}
if (response.status === 301 || response.status === 302) {
const newUrl = response.headers[`location`];
return this.access(Object.assign(Object.assign({}, config), { url: newUrl }));
}
else {
return neverThrow.ok(response);
}
});
};
if (userAgent !== undefined) {
this.defaultHeaders[`User-Agent`] = userAgent;
}
if (acceptLanguage !== undefined) {
this.defaultHeaders[`Accept-Language`] = acceptLanguage;
}
}
}
export default { Cookie, Client };