iaremarkus_wol-reference-vi.../referenceService.ts

64 lines
1.6 KiB
TypeScript
Raw Permalink Normal View History

import { requestUrl } from "obsidian";
2026-03-26 08:50:58 +00:00
import { ReferenceData } from "./types";
const WORKER_BASE = "https://wol-worker.iaremark.us";
interface CacheEntry {
data: ReferenceData;
ts: number;
}
const CACHE_TTL_MS = 30 * 60 * 1000; // 30 minutes
const referenceCache = new Map<string, CacheEntry>();
function slugify(ref: string): string {
return ref
.trim()
.toLowerCase()
.replace(/[^a-z0-9]+/g, "_")
.replace(/^_|_$/, "");
}
function isFresh(entry: CacheEntry): boolean {
return Date.now() - entry.ts < CACHE_TTL_MS;
}
export function clearReferenceCache() {
referenceCache.clear();
}
2026-03-26 09:59:43 +00:00
export function isCached(ref: string): boolean {
const key = slugify(ref);
const entry = referenceCache.get(key);
return !!entry && isFresh(entry);
}
2026-03-26 08:50:58 +00:00
export async function fetchReference(
ref: string,
signal?: AbortSignal,
): Promise<ReferenceData | null> {
const key = slugify(ref);
const cached = referenceCache.get(key);
if (cached && isFresh(cached)) return cached.data;
if (signal?.aborted) return null;
2026-03-26 08:50:58 +00:00
try {
const response = await requestUrl(`${WORKER_BASE}/${encodeURIComponent(ref)}`);
if (signal?.aborted) return null;
if (response.status !== 200) return null;
const raw = response.json as { results: string[] };
2026-03-26 08:50:58 +00:00
const data: ReferenceData = {
type: "reference",
ref,
results: raw.results ?? [],
};
referenceCache.set(key, { data, ts: Date.now() });
return data;
} catch (e) {
if (signal?.aborted) return null;
2026-03-26 08:50:58 +00:00
console.error(`Error fetching reference "${ref}":`, e);
return null;
}
}