import { type Accessor, createMemo } from "solid-js" import { type CacheEntryParams, getCacheEntry, setCacheEntry, clearCacheScope, clearCacheForSession, clearCacheForInstance, } from "../global-cache" /** * `useGlobalCache` exposes a tiny typed facade over the shared cache helpers. * Callers can pass raw values or accessors for the cache keys; empty identifiers * automatically fall back to the global buckets. */ export function useGlobalCache(params: UseGlobalCacheParams): GlobalCacheHandle { const resolvedEntry = createMemo(() => { const instanceId = normalizeId(resolveValue(params.instanceId)) const sessionId = normalizeId(resolveValue(params.sessionId)) const scope = resolveValue(params.scope) const cacheId = resolveValue(params.cacheId) const version = String(resolveValue(params.version)) return { instanceId, sessionId, scope, cacheId, version } }) const scopeParams = createMemo(() => { const entry = resolvedEntry() return { instanceId: entry.instanceId, sessionId: entry.sessionId, scope: entry.scope } }) const sessionParams = createMemo(() => { const entry = resolvedEntry() return { instanceId: entry.instanceId, sessionId: entry.sessionId } }) return { get() { return getCacheEntry(resolvedEntry()) }, set(value: T | undefined) { setCacheEntry(resolvedEntry(), value) }, clearScope() { clearCacheScope(scopeParams()) }, clearSession() { const params = sessionParams() clearCacheForSession(params.instanceId, params.sessionId) }, clearInstance() { const params = sessionParams() clearCacheForInstance(params.instanceId) }, params() { return resolvedEntry() }, } } function normalizeId(value?: string): string | undefined { return value && value.length > 0 ? value : undefined } function resolveValue(value: MaybeAccessor | undefined): T { if (typeof value === "function") { return (value as Accessor)() } return value as T } type MaybeAccessor = T | Accessor interface UseGlobalCacheParams { instanceId?: MaybeAccessor sessionId?: MaybeAccessor scope: MaybeAccessor cacheId: MaybeAccessor version: MaybeAccessor } interface GlobalCacheHandle { get(): T | undefined set(value: T | undefined): void clearScope(): void clearSession(): void clearInstance(): void params(): CacheEntryParams }