import { CookieJar } from 'jsdom'; import nodeFetch, { RequestInit, Response } from 'node-fetch'; import { Errors, RenaiError } from '../../types/error'; import { load, save, StoreKeys } from './store'; export let cookieJar: CookieJar = new CookieJar(); let error: Error; function init(): void { load(StoreKeys.COOKIES) .then((cookies: any) => { if (cookies !== undefined) { cookieJar = CookieJar.deserializeSync(cookies); } }) .catch((reason: any) => { error = new RenaiError(Errors.EINITFAIL, reason); }); } export function fetch(url: string, requestInit: RequestInit = {}): Promise { if (error !== undefined) { return Promise.reject(error); } const cookiedInit = { ...requestInit, ...{ headers: { ...requestInit.headers, ...{ Cookie: cookieJar.getCookieStringSync(url), }, }, }, }; return nodeFetch(url, cookiedInit).then((res: Response) => { setCookies(res.headers.raw()['set-cookie'], url).catch((reason: any) => { error = new Error(reason); }); return res; }); } function setCookies(header: string[], url: string): Promise { if (header) { header.forEach((cookie: string) => { cookieJar.setCookieSync(cookie, url); }); return save(StoreKeys.COOKIES, cookieJar.serializeSync()); } return Promise.resolve(); } init();