added fetchLatestArtifactMetadata() and downloadFile() functions

This commit is contained in:
Veetaha
2020-02-07 03:11:24 +02:00
parent 1bdb78a89f
commit 3e0e4e90ae
4 changed files with 111 additions and 1 deletions

View File

@@ -0,0 +1,26 @@
import fetch from "node-fetch";
import { throttle } from "throttle-debounce";
import * as fs from "fs";
export async function downloadFile(
url: string,
destFilePath: fs.PathLike,
onProgress: (readBytes: number, totalBytes: number) => void
): Promise<void> {
onProgress = throttle(100, /* noTrailing: */ true, onProgress);
const response = await fetch(url);
const totalBytes = Number(response.headers.get('content-length'));
let readBytes = 0;
return new Promise<void>((resolve, reject) => response.body
.on("data", (chunk: Buffer) => {
readBytes += chunk.length;
onProgress(readBytes, totalBytes);
})
.on("end", resolve)
.on("error", reject)
.pipe(fs.createWriteStream(destFilePath))
);
}

View File

@@ -0,0 +1,55 @@
import fetch from "node-fetch";
const GITHUB_API_ENDPOINT_URL = "https://api.github.com";
export interface FetchLatestArtifactMetadataOpts {
repoName: string;
repoOwner: string;
artifactFileName: string;
}
export interface ArtifactMetadata {
releaseName: string;
releaseDate: Date;
downloadUrl: string;
}
export async function fetchLatestArtifactMetadata(
opts: FetchLatestArtifactMetadataOpts
): Promise<ArtifactMetadata | null> {
const repoOwner = encodeURIComponent(opts.repoOwner);
const repoName = encodeURIComponent(opts.repoName);
const apiEndpointPath = `/repos/${repoOwner}/${repoName}/releases/latest`;
const requestUrl = GITHUB_API_ENDPOINT_URL + apiEndpointPath;
// We skip runtime type checks for simplicity (here we cast from `any` to `Release`)
const response: GithubRelease = await fetch(requestUrl, {
headers: { Accept: "application/vnd.github.v3+json" }
})
.then(res => res.json());
const artifact = response.assets.find(artifact => artifact.name === opts.artifactFileName);
return !artifact ? null : {
releaseName: response.name,
releaseDate: new Date(response.published_at),
downloadUrl: artifact.browser_download_url
};
// Noise denotes tremendous amount of data that we are not using here
interface GithubRelease {
name: string;
published_at: Date;
assets: Array<{
browser_download_url: string;
[noise: string]: unknown;
}>;
[noise: string]: unknown;
}
}