Skip to content

Commit

Permalink
Merge branch 'main' into tomknickman/turbo-531-globally-installed-tur…
Browse files Browse the repository at this point in the history
  • Loading branch information
tknickman committed Dec 6, 2022
2 parents 191443a + c1ddebe commit f52dad0
Showing 1 changed file with 113 additions and 0 deletions.
113 changes: 113 additions & 0 deletions docs/pages/api/binaries/version.ts
Original file line number Diff line number Diff line change
@@ -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",
};

0 comments on commit f52dad0

Please sign in to comment.