import { env } from "cloudflare:workers";
import { viewerFromRequest, viewerFromSessionCookie } from "./auth";
import { hasPermission, loadRepo, repoPermission } from "./repos";
import { first, run } from "./db";
import { randomId } from "./crypto";
import { limitBrowse, limitHeavy } from "./limits";
import { HttpError } from "./errors";
import { listRefs, resolveRevision, splitRevisionPath } from "./git/refs";
import { GitStore } from "./git/store";
import { lfsContentFor, lfsImageType } from "./lfs/content";
import { MAX_POINTER_BYTES } from "./lfs/pointer";
import type { Permission, RepoRow, TreeEntry, Viewer } from "~/lib/types";
const RAW_PATH = /^\/([^/]+)\/([^/]+)\/raw\/(.+)$/;
const ARCHIVE_PATH = /^\/([^/]+)\/([^/]+)\/archive\/(.+)\.(tar\.gz|tgz)$/;
const ASSET_DOWNLOAD_PATH = /^\/([^/]+)\/([^/]+)\/releases\/download\/([^/]+)\/([^/]+)$/;
const ASSET_UPLOAD_PATH = /^\/([^/]+)\/([^/]+)\/releases\/([a-z0-9]+)\/assets$/;
const MAX_ARCHIVE_FILES = 5000;
const MAX_ARCHIVE_BYTES = 200 * 1024 * 1024;
const MAX_ASSET_BYTES = 2 * 1024 * 1024 * 1024;
const MAX_ASSETS_PER_RELEASE = 50;
const TAR_BLOCK = 512;
const TAR_NAME_BYTES = 100;
const TAR_PREFIX_BYTES = 155;
const SAFE_IMAGE_TYPES = new Set(["image/png", "image/jpeg", "image/gif", "image/webp", "image/avif", "image/x-icon"]);
const encoder = new TextEncoder();
async function viewerFor(request: Request): Promise<Viewer | null> {
return (await viewerFromSessionCookie(request)) ?? (await viewerFromRequest(request));
}
async function access(request: Request, owner: string, name: string, needed: Permission): Promise<RepoRow | Response> {
const viewer = await viewerFor(request);
const repo = await loadRepo(owner, decodeURIComponent(name));
if (!repo) return new Response("Not found", { status: 404 });
const permission = await repoPermission(repo, viewer);
if (permission === "none") return new Response("Not found", { status: 404 });
if (!hasPermission(permission, needed)) return new Response("Forbidden", { status: 403 });
return repo;
}