Enable E-Tags for GUI and RAW
This commit is contained in:
		@ -142,7 +142,7 @@ async function uploadPackage(ctx: ABC.Context) {
 | 
			
		||||
      }
 | 
			
		||||
      console.log("Setting new live version");
 | 
			
		||||
 | 
			
		||||
      //TODO: Better option, since this could error whith multiple upload to the same package
 | 
			
		||||
      //TODO: Better option, since this could error whith multiple uploads to the same package at the same time
 | 
			
		||||
      await db.package.update(
 | 
			
		||||
         { name: packageName },
 | 
			
		||||
         {
 | 
			
		||||
 | 
			
		||||
@ -19,6 +19,7 @@ export default function raw(g: ABC.Group) {
 | 
			
		||||
         ctx.params.path
 | 
			
		||||
      );
 | 
			
		||||
      if (!result) return E404();
 | 
			
		||||
      return result;
 | 
			
		||||
      ctx.response.headers.set("e-tag", result.etag);
 | 
			
		||||
      return result.data;
 | 
			
		||||
   });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1,29 +1,63 @@
 | 
			
		||||
import { ABC } from "../deps.ts";
 | 
			
		||||
import { basicauth, extractPackagePath } from "../utils.ts";
 | 
			
		||||
import { basicauth, extractPackagePath, sortVersions } from "../utils.ts";
 | 
			
		||||
 | 
			
		||||
import { Hash } from "../deps.ts";
 | 
			
		||||
import db, { IPackage } from "../db.ts";
 | 
			
		||||
 | 
			
		||||
const MAX_CACHE_AGE = 60 * 30; // 30 Minutes
 | 
			
		||||
 | 
			
		||||
const CACHE_CONTROL = "public, max-age=" + MAX_CACHE_AGE;
 | 
			
		||||
 | 
			
		||||
export default function views(g: ABC.Application) {
 | 
			
		||||
   g.get(
 | 
			
		||||
      "/",
 | 
			
		||||
      async (ctx) => {
 | 
			
		||||
         return ctx.render("index", {
 | 
			
		||||
            search: ctx.queryParams["q"],
 | 
			
		||||
         });
 | 
			
		||||
         // const render = await IndexView();
 | 
			
		||||
         // console.log(render);
 | 
			
		||||
         // ctx.response.body = render;
 | 
			
		||||
         // ctx.response.status = 200;
 | 
			
		||||
      },
 | 
			
		||||
      basicauth("views")
 | 
			
		||||
   );
 | 
			
		||||
   g.get(
 | 
			
		||||
      "/package/:package",
 | 
			
		||||
      async (ctx) => {
 | 
			
		||||
         let [packageName, packageVersion] = extractPackagePath(
 | 
			
		||||
            ctx.params.package
 | 
			
		||||
         );
 | 
			
		||||
   g.get("/", async (ctx) => {
 | 
			
		||||
      ctx.response.headers.set("cache-control", CACHE_CONTROL);
 | 
			
		||||
 | 
			
		||||
         return ctx.render("package", { packageName });
 | 
			
		||||
      },
 | 
			
		||||
      basicauth("views")
 | 
			
		||||
   );
 | 
			
		||||
      const search = ctx.queryParams.q;
 | 
			
		||||
 | 
			
		||||
      let packages: IPackage[] = [];
 | 
			
		||||
      if (search && search !== "") {
 | 
			
		||||
         packages = await db.package.find({
 | 
			
		||||
            name: RegExp(`${search}`),
 | 
			
		||||
         });
 | 
			
		||||
      } else {
 | 
			
		||||
         packages = await db.package.find({});
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      const etag =
 | 
			
		||||
         "W/" +
 | 
			
		||||
         Hash.createHash("sha3-256")
 | 
			
		||||
            .update(
 | 
			
		||||
               packages
 | 
			
		||||
                  .map((e) => {
 | 
			
		||||
                     const sorted = e.versions.sort(sortVersions).reverse();
 | 
			
		||||
                     return e.name + sorted[0];
 | 
			
		||||
                  })
 | 
			
		||||
                  .join(":")
 | 
			
		||||
            )
 | 
			
		||||
            .toString("base64");
 | 
			
		||||
 | 
			
		||||
      ctx.response.headers.set("e-tag", etag);
 | 
			
		||||
 | 
			
		||||
      return ctx.render("index", {
 | 
			
		||||
         packages,
 | 
			
		||||
         search,
 | 
			
		||||
      });
 | 
			
		||||
   });
 | 
			
		||||
   g.get("/package/:package", async (ctx) => {
 | 
			
		||||
      let [packageName, packageVersion] = extractPackagePath(
 | 
			
		||||
         ctx.params.package
 | 
			
		||||
      );
 | 
			
		||||
 | 
			
		||||
      const pkg = await db.package.findOne({ name: packageName });
 | 
			
		||||
 | 
			
		||||
      const etag =
 | 
			
		||||
         "W/" +
 | 
			
		||||
         Hash.createHash("sha3-256")
 | 
			
		||||
            .update(`${packageName}:${packageVersion}`)
 | 
			
		||||
            .toString("base64");
 | 
			
		||||
 | 
			
		||||
      await ctx.render("package", { pkg });
 | 
			
		||||
      ctx.response.headers.set("cache-control", CACHE_CONTROL);
 | 
			
		||||
      ctx.response.headers.set("E-Tag", etag);
 | 
			
		||||
   });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user