@xlink-network/xlink-sdk
Version:
1 lines • 2.15 kB
Source Map (JSON)
{"version":3,"sources":["../src/utils/pMemoize.ts"],"sourcesContent":["type SkipCacheFn<F extends (...args: readonly any[]) => Promise<any>> = (\n args: Parameters<F>,\n value: Awaited<ReturnType<F>>,\n) => Promise<boolean>\n\nexport function pMemoize<F extends (...args: readonly any[]) => Promise<any>>(\n options: {\n cacheKey: (args: Parameters<F>) => string\n skipCache?: boolean | SkipCacheFn<F>\n },\n fn: F,\n): F {\n type CachedValue = Promise<Awaited<ReturnType<F>>> | Awaited<ReturnType<F>>\n const cache = new Map<string, CachedValue>()\n\n const skipCache: SkipCacheFn<F> =\n options.skipCache == null\n ? async () => false\n : typeof options.skipCache === \"function\"\n ? options.skipCache\n : async () => options.skipCache as boolean\n\n return async function (...args: Parameters<F>) {\n const key = options.cacheKey(args)\n\n if (cache.has(key)) {\n return cache.get(key)!\n }\n\n const promise = (async () => {\n const cleanCache = (): void => {\n queueMicrotask(() => {\n if (cache.get(key) === promise) {\n cache.delete(key)\n }\n })\n }\n\n try {\n const result = await fn(...args)\n if (await skipCache(args, result)) {\n cleanCache()\n }\n return result\n } catch (e) {\n cleanCache()\n throw e\n }\n })()\n cache.set(key, promise)\n return promise\n } as any\n}\n"],"mappings":";AAKO,SAAS,SACd,SAIA,IACG;AAEH,QAAM,QAAQ,oBAAI,IAAyB;AAE3C,QAAM,YACJ,QAAQ,aAAa,OACjB,YAAY,QACZ,OAAO,QAAQ,cAAc,aAC3B,QAAQ,YACR,YAAY,QAAQ;AAE5B,SAAO,kBAAmB,MAAqB;AAC7C,UAAM,MAAM,QAAQ,SAAS,IAAI;AAEjC,QAAI,MAAM,IAAI,GAAG,GAAG;AAClB,aAAO,MAAM,IAAI,GAAG;AAAA,IACtB;AAEA,UAAM,WAAW,YAAY;AAC3B,YAAM,aAAa,MAAY;AAC7B,uBAAe,MAAM;AACnB,cAAI,MAAM,IAAI,GAAG,MAAM,SAAS;AAC9B,kBAAM,OAAO,GAAG;AAAA,UAClB;AAAA,QACF,CAAC;AAAA,MACH;AAEA,UAAI;AACF,cAAM,SAAS,MAAM,GAAG,GAAG,IAAI;AAC/B,YAAI,MAAM,UAAU,MAAM,MAAM,GAAG;AACjC,qBAAW;AAAA,QACb;AACA,eAAO;AAAA,MACT,SAAS,GAAG;AACV,mBAAW;AACX,cAAM;AAAA,MACR;AAAA,IACF,GAAG;AACH,UAAM,IAAI,KAAK,OAAO;AACtB,WAAO;AAAA,EACT;AACF;","names":[]}