75 lines
2.8 KiB
JavaScript
75 lines
2.8 KiB
JavaScript
import fs from "fs";
|
|
export default class CookieManager {
|
|
cookies = {};
|
|
parse(headers, domain) {
|
|
if (!this.cookies[domain])
|
|
this.cookies[domain] = {};
|
|
headers?.forEach(header => {
|
|
const [cookiePart, ...attributes] = header.split(';').map(part => part.trim());
|
|
const [name, value] = cookiePart.split('=');
|
|
const cookie = { value: value || "", domain };
|
|
attributes.forEach(attr => {
|
|
const [key, val] = attr.split('=');
|
|
const lowerKey = key.toLowerCase();
|
|
switch (lowerKey) {
|
|
case 'path':
|
|
cookie.path = val;
|
|
break;
|
|
case 'expires':
|
|
cookie.expires = val ? new Date(val) : undefined;
|
|
break;
|
|
case 'max-age':
|
|
cookie.maxAge = parseInt(val, 10);
|
|
break;
|
|
case 'httponly':
|
|
cookie.httpOnly = true;
|
|
break;
|
|
case 'secure':
|
|
cookie.secure = true;
|
|
break;
|
|
case 'samesite':
|
|
cookie.sameSite = val;
|
|
break;
|
|
}
|
|
});
|
|
Object.assign(this.cookies[domain], { [name]: cookie });
|
|
});
|
|
}
|
|
format(domain) {
|
|
this.cleanupExpiredCookies();
|
|
return Object.entries(this.cookies[domain] || {})
|
|
.map(([key, value]) => `${key}=${value.value}`)
|
|
.join('; ');
|
|
}
|
|
getCookies(domain) {
|
|
this.cleanupExpiredCookies();
|
|
return this.cookies[domain] || {};
|
|
}
|
|
cleanupExpiredCookies() {
|
|
const now = new Date();
|
|
Object.keys(this.cookies).forEach(domain => {
|
|
Object.keys(this.cookies[domain]).forEach(key => {
|
|
if (this.cookies[domain][key].expires && this.cookies[domain][key].expires < now)
|
|
delete this.cookies[domain][key];
|
|
});
|
|
});
|
|
}
|
|
saveToFile(filePath) {
|
|
this.cleanupExpiredCookies();
|
|
fs.writeFileSync(filePath, JSON.stringify(this.cookies, null, 2), "utf8");
|
|
}
|
|
loadFromFile(filePath) {
|
|
if (!fs.existsSync(filePath))
|
|
return console.warn(`The file ${filePath} does not exist.`);
|
|
const fileContent = fs.readFileSync(filePath, "utf8");
|
|
const loadedCookies = JSON.parse(fileContent);
|
|
Object.keys(loadedCookies).forEach(domain => {
|
|
Object.keys(loadedCookies[domain]).forEach(cookieName => {
|
|
const cookie = loadedCookies[domain][cookieName];
|
|
cookie.expires = cookie.expires ? new Date(cookie.expires) : undefined;
|
|
});
|
|
});
|
|
this.cookies = loadedCookies;
|
|
}
|
|
}
|