atagen

malice

public
Star0
Watch0
6d7dff75a67df5f7dc8a1843de20e5bc4db5769e
2
ssh://brewery@pls.lobotomise.me:33/atagen/malice.git

Blame: web/src/lib/avatar-cache.ts

132eeceeb362atagen2026-10-25 03:34 UTC1
export interface AvatarCache {
132eeceeb362atagen2026-10-25 03:34 UTC2
  match(key: string): Promise<Response | undefined>;
132eeceeb362atagen2026-10-25 03:34 UTC3
  put(key: string, response: Response): Promise<void>;
132eeceeb362atagen2026-10-25 03:34 UTC4
}
132eeceeb362atagen2026-10-25 03:34 UTC5
132eeceeb362atagen2026-10-25 03:34 UTC6
export function createAvatarLoader(
132eeceeb362atagen2026-10-25 03:34 UTC7
  cache: () => Promise<AvatarCache>,
7643577c76bbatagen2026-10-25 07:37 UTC8
  load: (query: string) => Promise<Response>
7643577c76bbatagen2026-10-25 07:37 UTC9
): (key: string, query: string) => Promise<Response> {
132eeceeb362atagen2026-10-25 03:34 UTC10
  const pending = new Map<string, Promise<Response>>();
132eeceeb362atagen2026-10-25 03:34 UTC11
7643577c76bbatagen2026-10-25 07:37 UTC12
  return async (key, query) => {
7643577c76bbatagen2026-10-25 07:37 UTC13
    const active = pending.get(key);
132eeceeb362atagen2026-10-25 03:34 UTC14
    if (active) return (await active).clone();
132eeceeb362atagen2026-10-25 03:34 UTC15
132eeceeb362atagen2026-10-25 03:34 UTC16
    const request = (async () => {
132eeceeb362atagen2026-10-25 03:34 UTC17
      let store: AvatarCache | null = null;
132eeceeb362atagen2026-10-25 03:34 UTC18
      try {
132eeceeb362atagen2026-10-25 03:34 UTC19
        store = await cache();
132eeceeb362atagen2026-10-25 03:34 UTC20
        const cached = await store.match(key);
132eeceeb362atagen2026-10-25 03:34 UTC21
        if (cached) return cached;
132eeceeb362atagen2026-10-25 03:34 UTC22
      } catch {
132eeceeb362atagen2026-10-25 03:34 UTC23
        store = null;
132eeceeb362atagen2026-10-25 03:34 UTC24
      }
132eeceeb362atagen2026-10-25 03:34 UTC25
7643577c76bbatagen2026-10-25 07:37 UTC26
      const response = await load(query);
132eeceeb362atagen2026-10-25 03:34 UTC27
      if (response.ok && store) {
132eeceeb362atagen2026-10-25 03:34 UTC28
        try {
132eeceeb362atagen2026-10-25 03:34 UTC29
          await store.put(key, response.clone());
132eeceeb362atagen2026-10-25 03:34 UTC30
        } catch {
132eeceeb362atagen2026-10-25 03:34 UTC31
          return response;
132eeceeb362atagen2026-10-25 03:34 UTC32
        }
132eeceeb362atagen2026-10-25 03:34 UTC33
      }
132eeceeb362atagen2026-10-25 03:34 UTC34
      return response;
132eeceeb362atagen2026-10-25 03:34 UTC35
    })();
7643577c76bbatagen2026-10-25 07:37 UTC36
    pending.set(key, request);
132eeceeb362atagen2026-10-25 03:34 UTC37
    try {
132eeceeb362atagen2026-10-25 03:34 UTC38
      return (await request).clone();
132eeceeb362atagen2026-10-25 03:34 UTC39
    } finally {
7643577c76bbatagen2026-10-25 07:37 UTC40
      if (pending.get(key) === request) pending.delete(key);
132eeceeb362atagen2026-10-25 03:34 UTC41
    }
132eeceeb362atagen2026-10-25 03:34 UTC42
  };
132eeceeb362atagen2026-10-25 03:34 UTC43
}