g1t/apps/web/app/lib/last-commits.server.ts

25 lines1,028 bytesCodeBlame
1/**
2 * Each entry's last commit for the file list, waited on only so long. An
3 * answer not yet kept walks history, which can take seconds on a large or
4 * busy repository; the page goes out without it then, the column empty,
5 * while the walk finishes in the background (waitUntil) so the next view
6 * has it from the cache. The page's stream never waits on it past its own
7 * timeout.
8 */
9import { waitUntil } from "cloudflare:workers";
10
11import type { LastCommits, RepoPath, Viewer } from "@g1t/contracts";
12
13import { repos } from "./services.server";
14
15/** How long the page waits for the column. */
16const WAIT_MS = 3_000;
17
18export function lastCommitsFor(path: RepoPath, viewer: Viewer, ref: string | null, treePath: string): Promise<LastCommits | null> {
19 const walk = repos
20 .lastCommits(path, viewer, ref, treePath)
21 .then((found) => (found.ok ? found.value : null))
22 .catch(() => null);
23 waitUntil(walk);
24 return Promise.race([walk, new Promise<null>((resolve) => setTimeout(() => resolve(null), WAIT_MS))]);
25}