diff options
Diffstat (limited to 'editors/code/src/installation/fetch_artifact_release_info.ts')
-rw-r--r-- | editors/code/src/installation/fetch_artifact_release_info.ts | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/editors/code/src/installation/fetch_artifact_release_info.ts b/editors/code/src/installation/fetch_artifact_release_info.ts new file mode 100644 index 000000000..7d497057a --- /dev/null +++ b/editors/code/src/installation/fetch_artifact_release_info.ts | |||
@@ -0,0 +1,52 @@ | |||
1 | import fetch from "node-fetch"; | ||
2 | import { GithubRepo, ArtifactReleaseInfo } from "./interfaces"; | ||
3 | |||
4 | const GITHUB_API_ENDPOINT_URL = "https://api.github.com"; | ||
5 | |||
6 | |||
7 | /** | ||
8 | * Fetches the release with `releaseTag` (or just latest release when not specified) | ||
9 | * from GitHub `repo` and returns metadata about `artifactFileName` shipped with | ||
10 | * this release or `null` if no such artifact was published. | ||
11 | */ | ||
12 | export async function fetchArtifactReleaseInfo( | ||
13 | repo: GithubRepo, artifactFileName: string, releaseTag?: string | ||
14 | ): Promise<null | ArtifactReleaseInfo> { | ||
15 | |||
16 | const repoOwner = encodeURIComponent(repo.owner); | ||
17 | const repoName = encodeURIComponent(repo.name); | ||
18 | |||
19 | const apiEndpointPath = releaseTag | ||
20 | ? `/repos/${repoOwner}/${repoName}/releases/tags/${releaseTag}` | ||
21 | : `/repos/${repoOwner}/${repoName}/releases/latest`; | ||
22 | |||
23 | const requestUrl = GITHUB_API_ENDPOINT_URL + apiEndpointPath; | ||
24 | |||
25 | // We skip runtime type checks for simplicity (here we cast from `any` to `GithubRelease`) | ||
26 | |||
27 | console.log("Issuing request for released artifacts metadata to", requestUrl); | ||
28 | |||
29 | // FIXME: handle non-ok response | ||
30 | const response: GithubRelease = await fetch(requestUrl, { | ||
31 | headers: { Accept: "application/vnd.github.v3+json" } | ||
32 | }) | ||
33 | .then(res => res.json()); | ||
34 | |||
35 | const artifact = response.assets.find(artifact => artifact.name === artifactFileName); | ||
36 | |||
37 | if (!artifact) return null; | ||
38 | |||
39 | return { | ||
40 | releaseName: response.name, | ||
41 | downloadUrl: artifact.browser_download_url | ||
42 | }; | ||
43 | |||
44 | // We omit declaration of tremendous amount of fields that we are not using here | ||
45 | interface GithubRelease { | ||
46 | name: string; | ||
47 | assets: Array<{ | ||
48 | name: string; | ||
49 | browser_download_url: string; | ||
50 | }>; | ||
51 | } | ||
52 | } | ||