From 4838df315931bb883f704ec3e1abe2685f296cdf Mon Sep 17 00:00:00 2001 From: HsiangNianian Date: Sat, 22 Apr 2023 19:52:26 +0800 Subject: 😀 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/pages/api/binaries/version.ts | 113 +++++++++++++++++++++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 docs/pages/api/binaries/version.ts (limited to 'docs/pages/api/binaries') 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", +}; -- cgit v1.2.3-70-g09d2