diff options
| author | 2023-04-22 19:52:26 +0800 | |
|---|---|---|
| committer | 2023-04-22 19:52:26 +0800 | |
| commit | 4838df315931bb883f704ec3e1abe2685f296cdf (patch) | |
| tree | 57a8550c4cd5338f1126364bb518c6cde8d96e7d /docs/pages/api/binaries | |
| parent | db74ade0234a40c2120ad5f2a41bee50ce13de02 (diff) | |
| download | HydroRoll-4838df315931bb883f704ec3e1abe2685f296cdf.tar.gz HydroRoll-4838df315931bb883f704ec3e1abe2685f296cdf.zip | |
😀
Diffstat (limited to 'docs/pages/api/binaries')
| -rw-r--r-- | docs/pages/api/binaries/version.ts | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/docs/pages/api/binaries/version.ts b/docs/pages/api/binaries/version.ts new file mode 100644 index 0000000..339a34d --- /dev/null +++ b/docs/pages/api/binaries/version.ts @@ -0,0 +1,113 @@ +import type { NextRequest } from "next/server"; + +const REGISTRY = "https://registry.npmjs.org"; +const DEFAULT_TAG = "latest"; +const SUPPORTED_PACKAGES = ["turbo"]; +const SUPPORTED_METHODS = ["GET"]; +const [DEFAULT_NAME] = SUPPORTED_PACKAGES; + +async function fetchDistTags({ name }: { name: string }) { + const result = await fetch(`${REGISTRY}/${name}`); + const json = await result.json(); + return json["dist-tags"]; +} + +function errorResponse({ + status, + message, +}: { + status: 400 | 404 | 500; + message: string; +}) { + return new Response( + JSON.stringify({ + error: message, + }), + { + status, + } + ); +} + +/* +This API is called via the turbo rust binary to check for version updates. + +Response Schema (200): +{ + "type": "object", + "properties": { + "name": { + "type": "string", + }, + "version": { + "type": "string", + }, + "tag": { + "type": "string", + } + } +} + +Errors (400 | 404 | 500): +{ + "type": "object", + "properties": { + "error": { + "type": "string", + } + } +} + +*/ +export default async function handler(req: NextRequest) { + if (!SUPPORTED_METHODS.includes(req.method)) { + return errorResponse({ + status: 404, + message: `unsupported method - ${req.method}`, + }); + } + + try { + const { searchParams } = new URL(req.url); + const name = searchParams.get("name") || DEFAULT_NAME; + const tag = searchParams.get("tag") || DEFAULT_TAG; + + if (!SUPPORTED_PACKAGES.includes(name)) { + return errorResponse({ + status: 400, + message: `unsupported package - ${name}`, + }); + } + + const versions = await fetchDistTags({ name }); + if (!versions || !versions[tag]) { + return errorResponse({ + status: 404, + message: `unsupported tag - ${tag}`, + }); + } + + return new Response( + JSON.stringify({ + name, + version: versions[tag], + tag, + }), + { + status: 200, + headers: { + "content-type": "application/json", + // cache for 15 minutes, and allow stale responses for 5 minutes + "cache-control": "public, s-maxage=900, stale-while-revalidate=300", + }, + } + ); + } catch (e) { + console.error(e); + return errorResponse({ status: 500, message: e.message }); + } +} + +export const config = { + runtime: "experimental-edge", +}; |
