60 lines
1.7 KiB
TypeScript
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;
|
|
});
|
|
}
|