// src/services/record-cache.js const cache = new Map(); const listeners = new Map(); function notify(key, data) { const keyListeners = listeners.get(key); if (keyListeners) { for (const callback of keyListeners) { callback(data); } } } export const recordCache = { /** * Get a cached record by key * @param {string} key - Cache key (typically AT Protocol URI, or "profile:{handle}" for profiles) * @returns {object|undefined} Cached record or undefined */ get(key) { return cache.get(key); }, /** * Set/merge record data. Dispatches update event. * @param {string} key - Cache key (typically AT Protocol URI, or "profile:{handle}" for profiles) * @param {object} data - Partial or full record data */ set(key, data) { const existing = cache.get(key) || {}; const merged = { ...existing, ...data }; cache.set(key, merged); notify(key, merged); }, /** * Check if a key is cached * @param {string} key - Cache key (typically AT Protocol URI, or "profile:{handle}" for profiles) * @returns {boolean} */ has(key) { return cache.has(key); }, /** * Subscribe to changes for a specific key * @param {string} key - Cache key (typically AT Protocol URI, or "profile:{handle}" for profiles) * @param {function} callback - Called with updated data */ subscribe(key, callback) { if (!listeners.has(key)) { listeners.set(key, new Set()); } listeners.get(key).add(callback); }, /** * Unsubscribe from changes * @param {string} key - Cache key (typically AT Protocol URI, or "profile:{handle}" for profiles) * @param {function} callback - The callback to remove */ unsubscribe(key, callback) { const keyListeners = listeners.get(key); if (keyListeners) { keyListeners.delete(callback); if (keyListeners.size === 0) { listeners.delete(key); } } }, /** * Clear all cached data and subscriptions (useful for logout) */ clear() { cache.clear(); listeners.clear(); } };