diff --git a/packages/console/app/src/routes/download/[platform].ts b/packages/console/app/src/routes/download/[platform].ts index 94e3957c60..486b6bf6c4 100644 --- a/packages/console/app/src/routes/download/[platform].ts +++ b/packages/console/app/src/routes/download/[platform].ts @@ -1,20 +1,37 @@ import { APIEvent } from "@solidjs/start" +import { DownloadPlatform } from "./types" const assetNames: Record = { "darwin-aarch64-dmg": "opencode-desktop-darwin-aarch64.dmg", + "darwin-x64-dmg": "opencode-desktop-darwin-x64.dmg", "windows-x64-nsis": "opencode-desktop-windows-x64.exe", "linux-x64-deb": "opencode-desktop-linux-amd64.deb", "linux-x64-rpm": "opencode-desktop-linux-x86_64.rpm", -} +} satisfies Record + +// Doing this on the server lets us preserve the original name for platforms we don't care to rename for +const downloadNames: Record = { + "darwin-aarch64-dmg": "OpenCode Desktop.dmg", + "darwin-x64-dmg": "OpenCode Desktop.dmg", + "windows-x64-nsis": "OpenCode Desktop Installer.exe", +} satisfies { [K in DownloadPlatform]?: string } export async function GET({ params: { platform } }: APIEvent) { const assetName = assetNames[platform] if (!assetName) return new Response("Not Found", { status: 404 }) - return await fetch(`https://github.com/sst/opencode/releases/latest/download/${assetName}`, { + const resp = await fetch(`https://github.com/sst/opencode/releases/latest/download/${assetName}`, { cf: { + // in case gh releases has rate limits cacheTtl: 60 * 60 * 24, cacheEverything: true, }, } as any) + + const downloadName = downloadNames[platform] + + const headers = new Headers(resp.headers) + if (downloadName) headers.set("content-disposition", `attachment; filename="${downloadName}"`) + + return new Response(resp.body, { ...resp, headers }) } diff --git a/packages/console/app/src/routes/download/index.tsx b/packages/console/app/src/routes/download/index.tsx index d8d2b5bb02..4f42587558 100644 --- a/packages/console/app/src/routes/download/index.tsx +++ b/packages/console/app/src/routes/download/index.tsx @@ -9,6 +9,7 @@ import desktopAppIcon from "../../asset/lander/opencode-desktop-icon.png" import { Legal } from "~/component/legal" import { config } from "~/config" import { createSignal, onMount, Show, JSX } from "solid-js" +import { DownloadPlatform } from "./types" type OS = "macOS" | "Windows" | "Linux" | null @@ -23,20 +24,23 @@ function detectOS(): OS { return null } -function getDownloadUrl(os: OS): string { - const base = "https://github.com/sst/opencode/releases/latest/download" +function getDownloadPlatform(os: OS): DownloadPlatform { switch (os) { case "macOS": - return `${base}/opencode-desktop-darwin-aarch64.dmg` + return "darwin-aarch64-dmg" case "Windows": - return `${base}/opencode-desktop-windows-x64.exe` + return "windows-x64-nsis" case "Linux": - return `${base}/opencode-desktop-linux-amd64.deb` + return "linux-x64-deb" default: - return `${base}/opencode-desktop-darwin-aarch64.dmg` + return "darwin-aarch64-dmg" } } +function getDownloadHref(platform: DownloadPlatform) { + return `/download/${platform}` +} + function IconDownload(props: JSX.SvgSVGAttributes) { return ( @@ -60,7 +64,6 @@ function CopyStatus() { } export default function Download() { - const downloadUrl = "https://github.com/sst/opencode/releases/latest/download" const [detectedOS, setDetectedOS] = createSignal(null) onMount(() => { @@ -92,7 +95,7 @@ export default function Download() {

Download OpenCode

Available in Beta for macOS, Windows, and Linux

- + Download for {detectedOS()} @@ -166,7 +169,7 @@ export default function Download() { macOS (Apple Silicon) - + Download @@ -182,7 +185,7 @@ export default function Download() { macOS (Intel) - + Download @@ -205,7 +208,7 @@ export default function Download() { Windows (x64) - + Download @@ -221,7 +224,7 @@ export default function Download() { Linux (.deb) - + Download @@ -237,7 +240,7 @@ export default function Download() { Linux (.rpm) - + Download diff --git a/packages/console/app/src/routes/download/types.ts b/packages/console/app/src/routes/download/types.ts new file mode 100644 index 0000000000..adf71880dc --- /dev/null +++ b/packages/console/app/src/routes/download/types.ts @@ -0,0 +1 @@ +export type DownloadPlatform = `darwin-${"x64" | "aarch64"}-dmg` | "windows-x64-nsis" | `linux-x64-${"deb" | "rpm"}`