DenReg/registry/src/http/raw.ts

60 lines
1.7 KiB
TypeScript

import { Path } from "../deps.ts";
import type { ABC } from "../deps.ts";
import {
extractPackagePath,
getAbsolutePackageVersion,
getFile,
} from "../utils.ts";
import db from "../db.ts";
const MAX_FIXED_CACHE_AGE = 60 * 60 * 24 * 365;
const MAX_FLOATING_CACHE_AGE = 60 * 30;
export default function raw(g: ABC.Group) {
g.get("/:package/*path", async (ctx) => {
console.log(ctx.params, ctx.path);
let [packageName, packageVersion] = extractPackagePath(
ctx.params.package
);
const pkg = await db.package.findOne({ name: packageName });
packageVersion = getAbsolutePackageVersion(pkg, packageVersion);
const E404 = () => {
ctx.response.status = 404;
ctx.response.body = "// Not found!";
};
const filepath = ctx.params.path;
const result = await getFile(packageName, packageVersion, filepath);
if (filepath.endsWith(".js")) {
const tsFile = filepath.substr(0, filepath.length - 3) + ".d.ts";
const tsResult = await getFile(packageName, packageVersion, tsFile);
if (tsResult) {
ctx.response.headers.set(
"X-TypeScript-Types",
"./" + Path.posix.basename(tsFile)
);
}
}
if (packageVersion && result) {
ctx.response.headers.set(
"cache-control",
"public, max-age=" + MAX_FIXED_CACHE_AGE
);
} else {
ctx.response.headers.set(
"cache-control",
"no-cache, max-age=" + MAX_FLOATING_CACHE_AGE
);
}
if (!result) return E404();
ctx.response.headers.set("e-tag", result.etag);
return result.data;
});
}