import { ReadAllStorage, ReadGetAllStorage, ReadStorage } from '@neo-one/node-core-esnext-esm'; import LRU from 'lru-cache'; type SerializeKeyString = ((key: Key) => string); export function createReadStorage({ cache, storage, serializeKeyString, }: { readonly cache: LRU.Cache; readonly storage: ReadStorage; readonly serializeKeyString: SerializeKeyString; }): ReadStorage { const get = async (key: Key): Promise => { const keyString = serializeKeyString(key); const value = cache.get(keyString); if (value !== undefined) { return value; } return storage.get(key).then((val) => { cache.set(keyString, val); return val; }); }; const tryGet = async (key: Key): Promise => { const keyString = serializeKeyString(key); const value = cache.get(keyString); if (value !== undefined) { return value; } return storage.tryGet(key).then((val) => { if (val !== undefined) { cache.set(keyString, val); } return val; }); }; return { get, tryGet }; } export function createReadAllStorage({ cache, storage, serializeKeyString, }: { readonly cache: LRU.Cache; readonly storage: ReadAllStorage; readonly serializeKeyString: SerializeKeyString; }): ReadAllStorage { const readStorage = createReadStorage({ cache, storage, serializeKeyString, }); return { get: readStorage.get, tryGet: readStorage.tryGet, all$: storage.all$, }; } export function createReadGetAllStorage({ cache, storage, serializeKeyString, }: { readonly cache: LRU.Cache; readonly storage: ReadGetAllStorage; readonly serializeKeyString: SerializeKeyString; }): ReadGetAllStorage { const readStorage = createReadStorage({ cache, storage, serializeKeyString, }); return { get: readStorage.get, tryGet: readStorage.tryGet, getAll$: storage.getAll$, }; }