xdl-node
Version:
A library for retrieving audio streams and other data from X Spaces, built on Node.js and TypeScript.
81 lines (80 loc) • 3.01 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.validateCookies = exports.loadValidCookies = exports.loadCookies = void 0;
// cookies.ts
const fs_1 = __importDefault(require("fs"));
const HEX_TEMPLATE = (length) => `(?:[0-9a-f]{2}){${length}}`;
const VALID_COOKIES = {
auth_token: new RegExp(HEX_TEMPLATE(20)),
ct0: new RegExp(HEX_TEMPLATE(80))
};
const COOKIES_PATTERN = new RegExp(`\\s+(${Object.keys(VALID_COOKIES).join('|')})\\s+(${HEX_TEMPLATE('20,80')})$`, 'gm');
/**
* Загружает cookies из указанного файла.
* @param filePath Путь к файлу cookies.
* @returns Объект с cookies.
* @throws Если загрузка не удалась.
*/
function loadCookies(filePath) {
try {
const data = fs_1.default.readFileSync(filePath, 'utf8');
const cookies = {};
// Обрабатываем строки файла формата Netscape
for (const line of data.split('\n')) {
const trimmed = line.trim();
if (!trimmed || trimmed.startsWith('#')) {
continue;
}
const parts = trimmed.split(/\s+/);
if (parts.length >= 7) {
const name = parts[5];
const value = parts.slice(6).join(' ');
cookies[name] = value;
}
}
return cookies;
}
catch (err) {
throw new Error(`Cannot load cookies from file: ${err.message}`);
}
}
exports.loadCookies = loadCookies;
// Функция для фильтрации только нужных cookies
function loadValidCookies(filePath) {
const cookies = loadCookies(filePath);
return {
auth_token: cookies.auth_token,
ct0: cookies.ct0,
};
}
exports.loadValidCookies = loadValidCookies;
/**
* Валидирует переданные cookies.
* @param cookies Объект с cookies.
* @throws Если отсутствуют нужные или присутствуют лишние/неверные cookies.
*/
function validateCookies(cookies) {
const validKeys = Object.keys(VALID_COOKIES);
const cookieKeys = Object.keys(cookies);
const missing = validKeys.filter(key => !(key in cookies));
if (missing.length > 0) {
throw new TypeError(`Missing required cookies: ${missing.join(', ')}`);
}
const extra = cookieKeys.filter(key => !validKeys.includes(key));
if (extra.length > 0) {
throw new TypeError(`Extra cookies: ${extra.join(', ')}`);
}
const invalid = [];
for (const key of validKeys) {
if (!VALID_COOKIES[key].test(String(cookies[key]))) {
invalid.push(key);
}
}
if (invalid.length > 0) {
throw new Error(`Invalid cookies: ${invalid.join(', ')}`);
}
}
exports.validateCookies = validateCookies;