Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 4x 4x 1x 4x 4x 2x 2x 2x 2x 2x 2x 2x 2x 1x 1x 7x 7x 7x 7x 1x 1x 3x 3x 3x 3x 1x 1x 1x 1x 4x 4x 4x 4x 4x 2x 4x 4x 2x 4x 4x 4x | import { Either, EitherAsync, Left, Maybe, Right } from "purify-ts";
import undici, {
HeadersInit,
ProxyAgent,
RequestInfo,
RequestInit,
} from "undici";
import fs from "node:fs";
import { ensureError } from "./misc.js";
export function parseUrl(url: string) {
return Maybe.encase(() => new URL(url));
}
function validateResponse(response: Response): Either<Error, Response> {
if (!response.ok) {
return Left(
new Error(
`HTTP error: ${response.statusText} (${response.status.toString()})`,
),
);
}
return Right(response);
}
export function fetchUrl(url: RequestInfo, init: RequestInit) {
return EitherAsync(() => undici.fetch(url, init))
.chain(response => EitherAsync.liftEither(validateResponse(response)))
.mapLeft(ensureError);
}
export function fetchJson(url: RequestInfo, init: RequestInit) {
return fetchUrl(url, init)
.chain(response => EitherAsync(() => response.json()))
.mapLeft(ensureError);
}
export function downloadFile(
url: RequestInfo,
init: RequestInit,
filepath: string,
) {
return fetchUrl(url, init)
.map(response => Maybe.fromNullable(response.body))
.chain(body =>
EitherAsync(() => fs.promises.writeFile(filepath, body.unsafeCoerce())),
)
.mapLeft(ensureError)
.map(() => filepath);
}
export function buildRequestInit(
proxyUrl: Maybe<URL>,
headers: Maybe<HeadersInit>,
) {
const init: RequestInit = {};
proxyUrl.ifJust(proxyUrl => {
init.dispatcher = new ProxyAgent(proxyUrl.toString());
});
headers.ifJust(headers => {
init.headers = headers;
});
return init;
}
|