rsshub
Version:
Make RSS Great Again!
59 lines (58 loc) • 2.27 kB
JavaScript
//#region lib/utils/puppeteer-utils.ts
/**
* Get Cookie-header-style cookie string from a puppeteer-style cookie array
*
* @param {import('puppeteer').Protocol.Network.CookieParam[]} cookies Puppeteer-style cookie array
* @param {RegExp | string} domainFilter Filter cookies by domain or RegExp
* @return {string} Cookie-header-style cookie string (e.g. "foobar; foo=bar; baz=qux")
*/
const parseCookieArray = (cookies, domainFilter) => {
if (typeof domainFilter === "string") {
const dotDomain = "." + domainFilter;
cookies = cookies.filter(({ domain }) => domain === domainFilter || domain.endsWith(dotDomain));
} else if (domainFilter && domainFilter.test !== void 0) cookies = cookies.filter(({ domain }) => domainFilter.test(domain));
return cookies.map(({ name, value }) => name ? `${name}=${value}` : value).join("; ");
};
/**
* Construct a puppeteer-style cookie array from a Cookie-header-style cookie string
*
* @param {string} cookieStr Cookie-header-style cookie string (e.g. "foobar; foo=bar; baz=qux")
* @param {string} domain Domain to set for each cookie
* @return {import('puppeteer').Protocol.Network.CookieParam[]} Puppeteer-style cookie array
*/
const constructCookieArray = (cookieStr, domain) => cookieStr.split("; ").map((item) => {
const [name, value] = item.split("=");
return value === void 0 ? {
name: "",
value: name,
domain
} : {
name,
value,
domain
};
});
/**
* Set cookies for a page
*
* @param {import('puppeteer').Page} page Puppeteer Page object
* @param {string} cookieStr Cookie-header-style cookie string (e.g. "foobar; foo=bar; baz=qux")
* @param {string} domain Domain to set for each cookie
* @return {Promise<void>}
*/
const setCookies = async (page, cookieStr, domain) => {
const cookies = constructCookieArray(cookieStr, domain);
await page.setCookie(...cookies);
};
/**
* Get Cookie-header-style cookie string from a page
*
* @param {import('puppeteer').Page} page Puppeteer Page object
* @param {RegExp | string} domainFilter Filter cookies by domain or RegExp
* @return {Promise<string>} Cookie-header-style cookie string
*/
const getCookies = async (page, domainFilter) => {
return parseCookieArray(await page.cookies(), domainFilter);
};
//#endregion
export { setCookies as n, getCookies as t };