import type { Cookie } from "puppeteer"; import { getBandaiRawCookieRedisKey, redis } from "./utils"; import { parseSetCookie } from "set-cookie-parser"; export default class BandaiCookie { #cookieMap = new Map(); #id: string; constructor(email: string) { this.#id = email; } async init() { const cache = await redis.get(getBandaiRawCookieRedisKey(this.#id)); if (!cache) return; const cookies: Cookie[] = JSON.parse(cache); cookies.map(cookie => { this.#cookieMap.set(cookie.name, cookie); }); } updateCookie(headers: Headers) { const setCookie = headers.getSetCookie(); const cookies = parseSetCookie(setCookie); cookies.forEach(cookie => { const value = this.#cookieMap.get(cookie.name); if (!value) { console.debug('Cookie %s not found', cookie.name); return; } this.#cookieMap.set(cookie.name, { ...value, value: cookie.value, domain: cookie.domain ?? value.domain, expires: cookie.expires?.getTime() || value.expires, }); }); } getCookie() { return this.#cookieMap.values() .toArray() .map((v) => `${v.name}=${v.value}`) .join('; '); } getRawCookie(): Cookie[] { const cookies = this.#cookieMap.values().toArray(); return cookies; } async saveCookie() { const cookieString = JSON.stringify(this.#cookieMap.values().toArray()); await redis.set(getBandaiRawCookieRedisKey(this.#id), cookieString); } }