added fetchLatestArtifactMetadata() and downloadFile() functions
This commit is contained in:
26
editors/code/src/github/download_file.ts
Normal file
26
editors/code/src/github/download_file.ts
Normal 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))
|
||||
);
|
||||
}
|
||||
55
editors/code/src/github/fetch_latest_artifact_metadata.ts
Normal file
55
editors/code/src/github/fetch_latest_artifact_metadata.ts
Normal 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;
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user