RenaiApp/src/main/services/web-crawler.ts

56 lines
1.4 KiB
TypeScript

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<Response> {
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<void> {
if (header) {
header.forEach((cookie: string) => {
cookieJar.setCookieSync(cookie, url);
});
return save(StoreKeys.COOKIES, cookieJar.serializeSync());
}
return Promise.resolve();
}
init();