Make it modern

This commit is contained in:
Fabian Stamm
2023-11-28 16:10:33 +01:00
parent 22a447604b
commit a14a5b9462
35 changed files with 656 additions and 200 deletions

View File

@ -1,16 +1,16 @@
import type { ABC } from "../deps.ts";
import {
basicauth,
extractPackagePath,
getBucketFilePath,
getFilePath,
getFile,
getOneOf,
getAbsolutePackageVersion,
sortVersions,
} from "../utils.ts";
import { Hash, Path } from "../deps.ts";
import db, { IPackage } from "../db.ts";
import bucket from "../s3.ts";
import * as Storage from "../storage.ts";
const MAX_CACHE_AGE = 60 * 30; // 30 Minutes
@ -31,6 +31,7 @@ export default function views(g: ABC.Application) {
packages = await db.package.find({});
}
await ctx.render("index", {
packages: packages.reverse(),
search,
@ -54,19 +55,36 @@ export default function views(g: ABC.Application) {
});
g.get("/package/:package", async (ctx) => {
let [packageName, packageVersion] = extractPackagePath(
const [packageName, packageVersion] = extractPackagePath(
ctx.params.package
);
const pkg = await db.package.findOne({ name: packageName });
if (!pkg) {
ctx.response.status = 404;
ctx.response.body = "// Package not found!";
return;
}
const readmeContentRaw = (await getOneOf(
pkg.name,
packageVersion || pkg.versions.sort(sortVersions).reverse()[0],
[pkg.readme, "README.md", "readme.md", "Readme.md"]
))?.data;
const readmeContent = readmeContentRaw
? new TextDecoder().decode(readmeContentRaw)
: "";
const etag =
"W/" +
Hash.createHash("sha3-256")
.update(`${packageName}:${packageVersion}`)
.toString("base64");
await ctx.render("package", { pkg, version: packageVersion });
await ctx.render("package", { pkg, version: packageVersion, readmeContent });
ctx.response.headers.set("cache-control", CACHE_CONTROL);
ctx.response.headers.set("E-Tag", etag);
});
@ -98,32 +116,29 @@ export default function views(g: ABC.Application) {
path: `${packageName}@${packageVersion}/${path}`,
});
} else {
const bucketPath = await getBucketFilePath(
const filesPath = getFilePath(
packageName,
packageVersion,
path
);
if (!bucketPath) return E404();
if (!filesPath) return E404();
console.log(bucketPath);
console.log(filesPath);
const filesItr = bucket.listAllObjects({
batchSize: 100,
prefix: bucketPath,
// delimiter: "/",
});
const filesItr = Storage.walkFiles(filesPath);
let files: { name: string; size: number }[] = [];
let directories: Set<string> = new Set();
const files: { name: string; size: number }[] = [];
const directories: Set<string> = new Set();
let readme: string | null = null;
for await (let file of filesItr) {
const relPath = Path.posix.relative(bucketPath, file.key || "");
for await (const file of filesItr) {
const relPath = Path.posix.relative(filesPath, file.path || "");
console.log({ file, relPath, filesPath });
if (relPath.indexOf("/") >= 0) {
directories.add(relPath.split("/")[0]);
} else {
files.push({ name: relPath, size: file.size || -1 });
files.push({ name: relPath, size: -1 }); //TODO: Size is not implemented yet
if (relPath.toLowerCase() === "readme.md") {
let readmeCont = await getFile(
const readmeCont = await getFile(
packageName,
packageVersion,
Path.posix.join(path, relPath)