aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/docs/pages/api/binaries/version.ts
diff options
context:
space:
mode:
authorHsiangNianian <admin@jyunko.cn>2023-04-22 19:52:26 +0800
committerHsiangNianian <admin@jyunko.cn>2023-04-22 19:52:26 +0800
commit4838df315931bb883f704ec3e1abe2685f296cdf (patch)
tree57a8550c4cd5338f1126364bb518c6cde8d96e7d /docs/pages/api/binaries/version.ts
parentdb74ade0234a40c2120ad5f2a41bee50ce13de02 (diff)
downloadHydroRoll-4838df315931bb883f704ec3e1abe2685f296cdf.tar.gz
HydroRoll-4838df315931bb883f704ec3e1abe2685f296cdf.zip
😀
Diffstat (limited to 'docs/pages/api/binaries/version.ts')
-rw-r--r--docs/pages/api/binaries/version.ts113
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",
+};