1// Owner-requested Git inventory reads bounded SQLite metadata. The database's2// physical byte meter already includes these objects, refs and retry receipts.3import { repository } from "./grasp-state.ts";4import { gitStoragePrefix } from "./grasp.ts";5import { featureOn } from "./settings.ts";6import { now } from "./event.ts";7import type { Relay } from "./relay.ts";89const nextInventory = new WeakMap<Relay, number>();10const failure = (error: string, status: number) => ({ body: { error }, status });1112// gitStorage reports one repository's retained payload and the shared database.13export async function gitStorage(relay: Relay, owner: string, identifier: string) {14 return relay.repositoryAccess.run("control", async () => {15 if (!featureOn(relay.settings.policy, "grasp")) return failure("not found", 404);16 if (relay.settings.isUnclaimed() || relay.settings.leaseExpired(now())) return failure("restricted: relay is not active", 403);17 const repo = repository(relay, owner, identifier);18 if (!repo) return failure("not found", 404);19 if (relay.fuelStatus().outOfFuel) return failure("restricted: relay storage or fuel limit reached", 403);20 const retryAfter = (nextInventory.get(relay) ?? 0) - now();21 if (retryAfter > 0) return { body: { error: "restricted: Git inventory cooldown; retry", retryAfter }, status: 429 };22 nextInventory.set(relay, now() + 60);23 const namespace = (await gitStoragePrefix(relay, repo)).split("/").filter(Boolean).at(-1)!;24 const cursor = relay.sql.exec<{ count: number; rawBytes: number; compressedBytes: number; metadataBytes: number }>("SELECT object_count AS count, raw_bytes AS rawBytes, compressed_bytes AS compressedBytes, metadata_bytes AS metadataBytes FROM git_sqlite_meta WHERE repository=?", namespace);25 const objects = cursor.toArray()[0] ?? { count: 0, rawBytes: 0, compressedBytes: 0, metadataBytes: 0 };26 const counts = relay.sql.exec<{ refs: number; receipts: number }>("SELECT (SELECT count(*) FROM git_sqlite_refs WHERE repository=?) AS refs, (SELECT count(*) FROM git_sqlite_receipts WHERE repository=?) AS receipts", namespace, namespace);27 const { refs, receipts } = counts.one();28 relay.meterPush(cursor.rowsRead + counts.rowsRead, cursor.rowsWritten + counts.rowsWritten);29 return { body: { result: { repository: { owner, identifier, announcement: repo.id }, backend: "sqlite", objects, refs, receipts, physicalDatabaseBytes: relay.eventBytes(), operations: { gets: 0, lists: 0 }, limits: relay.settings.policy.git, cooldownSeconds: 60, capturedAt: now() } }, status: 200 };30 }, () => failure("restricted: relay operation in progress; retry", 429));31}