Skip to content

Commit dd4c8f8

Browse files
committed
Add gh-release/download
1 parent 09e9abc commit dd4c8f8

File tree

6 files changed

+150
-0
lines changed

6 files changed

+150
-0
lines changed

packages/gh-download/.gitignore

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
/target
2+
/dist
3+
**/*.rs.bk
4+
Cargo.lock
5+
bin/
6+
pkg/
7+
wasm-pack.log
8+
worker/
9+
node_modules/
10+
.cargo-ok

packages/gh-download/.prettierrc

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"semi": false,
3+
"tabWidth": 4,
4+
"printWidth": 80
5+
}

packages/gh-download/index.js

+70
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
export default {
2+
async fetch(request, env) {
3+
return await handleRequest(request).catch(
4+
(err) => new Response(err.stack, { status: 500 })
5+
)
6+
},
7+
}
8+
9+
/**
10+
* @param {Request} request
11+
* @returns {Promise<Response>}
12+
*/
13+
async function handleRequest(request) {
14+
const { searchParams, pathname } = new URL(request.url)
15+
16+
if (pathname == "/") {
17+
return new Response(
18+
"Having trouble getting a direct link to the latest release on github?\nTry adding a path: https://gh-release.publicarray.workers.dev/$user/$reposetory\nFor Example: https://gh-release.publicarray.workers.dev/lostindark/DriverStoreExplorer\nIf there are multiple assets you can match againt the file name otherwise the first one is returned\nE.g. https://gh-release.publicarray.workers.dev/Klocman/Bulk-Crap-Uninstaller?name=portable or https://gh-release.publicarray.workers.dev/Klocman/Bulk-Crap-Uninstaller?name=setup",
19+
{
20+
headers: { "Content-Type": "text/text; charset=utf-8" },
21+
}
22+
)
23+
}
24+
25+
// todo validate pathname
26+
27+
let ghApiResponse = await fetch(
28+
`https://api.github.com/repos${pathname}/releases/latest`,
29+
{
30+
headers: {
31+
Accept: "application/vnd.github+json",
32+
"User-Agent":
33+
"gh-release-redirect/0 <https://gh-release.publicarray.workers.dev>",
34+
},
35+
cf: {
36+
cacheTtl: 86400,
37+
cacheEverything: true,
38+
},
39+
}
40+
)
41+
if (!ghApiResponse.ok) {
42+
return ghApiResponse
43+
}
44+
45+
let json = await ghApiResponse.json()
46+
// console.log(json.assets)
47+
var downloadURL = json.assets[0].browser_download_url
48+
// if there are multiple assets allow user to search based on file name
49+
if (searchParams.has("name")) {
50+
let name = searchParams.get("name")
51+
for (let i = 0; i < json.assets.length; ++i) {
52+
let asset = json.assets[i]
53+
// console.log(asset, asset.name.toLowerCase().includes(name.toLowerCase()))
54+
if (asset.name.toLowerCase().includes(name.toLowerCase())) {
55+
// update download URL
56+
downloadURL = asset.browser_download_url
57+
break
58+
}
59+
}
60+
// json.assets.forEach((asset) => {
61+
// console.log(asset, asset.name.toLowerCase().includes(name.toLowerCase()))
62+
// if (asset.name.toLowerCase().includes(name.toLowerCase())) {
63+
// // update download URL
64+
// downloadURL = asset.browser_download_url
65+
// }
66+
// });
67+
}
68+
69+
return Response.redirect(downloadURL, 302)
70+
}

packages/gh-download/package-lock.json

+39
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/gh-download/package.json

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
{
2+
"private": true,
3+
"name": "gh-download",
4+
"version": "1.0.0",
5+
"description": "Redirect to most recent release direct download of an asset",
6+
"main": "index.js",
7+
"scripts": {
8+
"test": "echo \"Error: no test specified\" && exit 1",
9+
"format": "prettier --write '**/*.{js,css,json,md}'",
10+
"publish": "wrangler publish",
11+
"build": "wrangler publish --dry-run --outdir=dist"
12+
},
13+
"author": "Sebastian Schmidt <[email protected]>",
14+
"license": "MIT",
15+
"devDependencies": {
16+
"prettier": "^2.7.1"
17+
}
18+
}

packages/gh-download/wrangler.toml

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
compatibility_date = "2022-12-31"
2+
name = "gh-download"
3+
account_id = "5a007c3f1b1463e3f024ef2a654e3307"
4+
routes = [
5+
{ pattern = "gh.seby.io/*", zone_name = "seby.io" },
6+
{ pattern = "gh.seby.au/*", zone_name = "seby.au" }
7+
]
8+
main = "index.js"

0 commit comments

Comments
 (0)