UNPKG

nhentai-tools

Version:

A toolset to interact with the doujin site nhentai.net

91 lines (90 loc) 3.56 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.minDelay = exports.preventTooManyRequests = exports.client = exports.jar = void 0; const axios_1 = require("axios"); class CookieJar { constructor() { this.jar = {}; } get(name) { return this.jar[name]; } set(name, value) { // console.log('set', name, value) if (value) { this.jar[name] = value; } else { delete this.jar[name]; } } setFromHeader(header) { const [name, value] = header.split('; ')[0].split('='); this.set(name, value); } has(name) { return this.jar[name] !== undefined; } clear() { this.jar = {}; } isEmpty() { return Object.keys(this.jar).length === 0; } toString() { return Object.entries(this.jar).map(([name, value]) => `${name}=${value}`).join('; '); } } const delay = (ms) => new Promise(resolve => setTimeout(resolve, ms)); const customHeaders = {}; /** A custom CookieJar implementation. Only mess with this if you really know what you're doing. */ exports.jar = new CookieJar(); /** nhentai-tool's custom axios client. */ exports.client = axios_1.default.create({ baseURL: 'https://nhentai.net', maxRedirects: 0 }); /* eslint-disable prefer-const */ /** Whether requests should be delayed or not. */ exports.preventTooManyRequests = true; /* eslint-disable prefer-const */ /** The minimum ms delay between requests. */ exports.minDelay = 200; let lastRequestTime = 0; exports.client.interceptors.request.use((config) => __awaiter(void 0, void 0, void 0, function* () { // console.log(config.method, config.url) config.headers = Object.assign(Object.assign({}, config.headers), { Cookie: exports.jar.toString() }); Object.assign(config.headers, customHeaders); // prevent 429 Too Many Requests by waiting a bit (200ms seems to be the minimum) if (exports.preventTooManyRequests) { const now = Date.now(); const delayAmount = lastRequestTime + exports.minDelay - now; if (delayAmount > 0) yield delay(delayAmount); lastRequestTime = now; } return config; })); exports.client.interceptors.response.use(response => { var _a; if (typeof response.data === 'string') { if (response.data.match(/new App\(\{\n\t\t\t\t\tcsrf_token: "/)) { customHeaders['x-csrftoken'] = response.data.split('csrf_token: "')[1].split('"')[0] || customHeaders['x-csrftoken']; } } (_a = response.headers['set-cookie']) === null || _a === void 0 ? void 0 : _a.forEach((cookie) => { if (!cookie) return; exports.jar.setFromHeader(cookie); }); return response; });