All files / src/util net.ts

81.63% Statements 40/49
100% Branches 11/11
80% Functions 4/5
81.63% Lines 40/49

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 501x 1x 1x 1x 1x 1x 1x 1x 1x 1x 4x 4x 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 { Maybe, MaybeAsync } from "purify-ts";
import undici, {
  HeadersInit,
  ProxyAgent,
  RequestInfo,
  RequestInit,
} from "undici";
import fs from "node:fs";
 
export function parseUrl(url: string) {
  return Maybe.encase(() => new URL(url));
}
 
export function fetchUrl(url: RequestInfo, init: RequestInit) {
  return MaybeAsync(() => undici.fetch(url, init)).filter(
    response => response.ok,
  );
}
 
export function fetchJson(url: RequestInfo, init: RequestInit) {
  return fetchUrl(url, init).chain(response =>
    MaybeAsync(() => response.json()),
  );
}
 
export function downloadFile(
  url: RequestInfo,
  init: RequestInit,
  filepath: string,
) {
  return fetchUrl(url, init)
    .chain(response => MaybeAsync.liftMaybe(Maybe.fromNullable(response.body)))
    .chain(body => MaybeAsync(() => fs.promises.writeFile(filepath, body)))
    .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;
}