Skip to content
File

Blob: src/worker/do/repo/catalog/activity.ts

typescript43 lines
1import { asTypedStorage } from "../repoState";
2import type { RepoLease, RepoStateSchema } from "../repoState";
3 
4export type RepoActivitySnapshot =
5 | { state: "idle"; compactionWantedAt?: number }
6 | { state: "receiving"; lease: RepoLease }
7 | { state: "compacting"; lease: RepoLease; compactionWantedAt?: number };
8 
9export function activeLeaseOrUndefined(
10 lease: RepoLease | undefined,
11 now: number
12): RepoLease | undefined {
13 if (!lease) return undefined;
14 return lease.expiresAt > now ? lease : undefined;
15}
16 
17export async function getRepoActivitySnapshot(
18 ctx: DurableObjectState
19): Promise<RepoActivitySnapshot> {
20 const store = asTypedStorage<RepoStateSchema>(ctx.storage);
21 const now = Date.now();
22 
23 const receiveLease = activeLeaseOrUndefined(await store.get("receiveLease"), now);
24 if (receiveLease) {
25 return { state: "receiving", lease: receiveLease };
26 }
27 
28 const compactLease = activeLeaseOrUndefined(await store.get("compactLease"), now);
29 const compactionWantedAt = await store.get("compactionWantedAt");
30 if (compactLease) {
31 return {
32 state: "compacting",
33 lease: compactLease,
34 compactionWantedAt,
35 };
36 }
37 
38 return {
39 state: "idle",
40 compactionWantedAt,
41 };
42}