All files / src/util net.ts

81.25% Statements 52/64
100% Branches 13/13
83.33% Functions 5/6
81.25% Lines 52/64

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 651x 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;
}