UNPKG

@alauda-fe/common

Version:

Alauda frontend team common codes.

82 lines 12.4 kB
import { BehaviorSubject, catchError, filter, map, of, startWith, Subject, switchMap, takeUntil, tap, } from 'rxjs'; import { isEqual, publishRef } from '../utils/public-api'; export class CacheStore { constructor({ fetcher, share, validator }) { this.store = new Map(); this.forEach = this.store.forEach.bind(this.store); this.entries = this.store.entries.bind(this.store); this.values = this.store.values.bind(this.store); this.keys = this.store.keys.bind(this.store); this.fetcher = fetcher; this.share = share ?? publishRef; this.validator = validator ?? (() => true); } fetchState(params) { let cache = this.get(params); if (!cache) { const refetch$$ = new BehaviorSubject(null); const finish$$ = new Subject(); cache = { refetch: () => { refetch$$.next(); }, finish: () => { finish$$.next(); finish$$.complete(); }, loadState: refetch$$.pipe(switchMap(() => this.fetcher(params).pipe(map(result => ({ state: 'loaded', result })), catchError(error => of({ state: 'loadFailed', error })), startWith({ state: 'loading' }))), tap(loadState => { if (loadState.state !== 'loading' && !this.validator(loadState)) { for (const [key, value] of this.store.entries()) { if (isEqual(key, params)) { this.store.delete(key); setTimeout(() => { value.finish(); }); return; } } } }), takeUntil(finish$$), this.share()), }; this.store.set(params, cache); } return cache.loadState; } fetch(params) { return this.fetchState(params).pipe(filter(loadState => loadState.state === 'loaded'), map(loadState => loadState.result)); } refetch(params) { this.get(params)?.refetch(); } refetchAll() { this.forEach(cache => { cache.refetch(); }); } get(params) { for (const [key, value] of this.store.entries()) { if (isEqual(key, params)) { return value; } } } has(params) { return !!this.get(params); } delete(params) { for (const [key, value] of this.store.entries()) { if (isEqual(key, params)) { this.store.delete(key); value.finish(); return; } } } clear() { this.store.forEach(value => { value.finish(); }); this.store.clear(); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGUtc3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbW1vbi9zcmMvY29yZS91dGlscy9jYWNoZS1zdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsZUFBZSxFQUNmLFVBQVUsRUFDVixNQUFNLEVBQ04sR0FBRyxFQUdILEVBQUUsRUFDRixTQUFTLEVBQ1QsT0FBTyxFQUNQLFNBQVMsRUFDVCxTQUFTLEVBQ1QsR0FBRyxHQUNKLE1BQU0sTUFBTSxDQUFDO0FBRWQsT0FBTyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUUxRCxNQUFNLE9BQU8sVUFBVTtJQU9yQixZQUFZLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQTJCO1FBRmpELFVBQUssR0FBRyxJQUFJLEdBQUcsRUFBZSxDQUFDO1FBcUdoRCxZQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUU5QyxZQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUU5QyxXQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUU1QyxTQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQXhHdEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLElBQUksVUFBVSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMs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TUFBUztRQUNYLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7WUFDaEQsSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUM7Z0JBQ3pCLE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsR0FBRyxDQUFDLE1BQVM7UUFDWCxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRCxNQUFNLENBQUMsTUFBUztRQUNkLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7WUFDaEQsSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUN2QixLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ2YsT0FBTztZQUNULENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUs7UUFDSCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUN6QixLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDakIsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3JCLENBQUM7Q0FTRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEJlaGF2aW9yU3ViamVjdCxcbiAgY2F0Y2hFcnJvcixcbiAgZmlsdGVyLFxuICBtYXAsXG4gIE1vbm9UeXBlT3BlcmF0b3JGdW5jdGlvbixcbiAgT2JzZXJ2YWJsZSxcbiAgb2YsXG4gIHN0YXJ0V2l0aCxcbiAgU3ViamVjdCxcbiAgc3dpdGNoTWFwLFxuICB0YWtlVW50aWwsXG4gIHRhcCxcbn0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IGlzRXF1YWwsIHB1Ymxpc2hSZWYgfSBmcm9tICcuLi91dGlscy9wdWJsaWMtYXBpJztcblxuZXhwb3J0IGNsYXNzIENhY2hlU3RvcmU8UCwgVj4ge1xuICBwcml2YXRlIHJlYWRvbmx5IGZldGNoZXI6IChwYXJhbXM6IFApID0+IE9ic2VydmFibGU8Vj47XG4gIHByaXZhdGUgcmVhZG9ubHkgc2hhcmU6IDxUPigpID0+IE1vbm9UeXBlT3BlcmF0b3JGdW5jdGlvbjxUPjtcbiAgcHJpdmF0ZSByZWFkb25seSB2YWxpZGF0b3I6IChsb2FkU3RhdGU6IENhY2hlTG9hZFN0YXRlPFY+KSA9PiBib29sZWFuO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgc3RvcmUgPSBuZXcgTWFwPFAsIENhY2hlPFY+PigpO1xuXG4gIGNvbnN0cnVjdG9yKHsgZmV0Y2hlciwgc2hhcmUsIHZhbGlkYXRvciB9OiBDYWNoZVN0b3JlT3B0aW9uczxQLCBWPikge1xuICAgIHRoaXMuZmV0Y2hlciA9IGZldGNoZXI7XG4gICAgdGhpcy5zaGFyZSA9IHNoYXJlID8/IHB1Ymxpc2hSZWY7XG4gICAgdGhpcy52YWxpZGF0b3IgPSB2YWxpZGF0b3IgPz8gKCgpID0+IHRydWUpO1xuICB9XG5cbiAgZmV0Y2hTdGF0ZShwYXJhbXM6IFApIHtcbiAgICBsZXQgY2FjaGUgPSB0aGlzLmdldChwYXJhbXMpO1xuXG4gICAgaWYgKCFjYWNoZSkge1xuICAgICAgY29uc3QgcmVmZXRjaCQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDx2b2lkPihudWxsKTtcbiAgICAgIGNvbnN0IGZpbmlzaCQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAgICAgY2FjaGUgPSB7XG4gICAgICAgIHJlZmV0Y2g6ICgpID0+IHtcbiAgICAgICAgICByZWZldGNoJCQubmV4dCgpO1xuICAgICAgICB9LFxuICAgICAgICBmaW5pc2g6ICgpID0+IHtcbiAgICAgICAgICBmaW5pc2gkJC5uZXh0KCk7XG4gICAgICAgICAgZmluaXNoJCQuY29tcGxldGUoKTtcbiAgICAgICAgfSxcbiAgICAgICAgbG9hZFN0YXRlOiByZWZldGNoJCQucGlwZShcbiAgICAgICAgICBzd2l0Y2hNYXAoKCkgPT5cbiAgICAgICAgICAgIHRoaXMuZmV0Y2hlcihwYXJhbXMpLnBpcGUoXG4gICAgICAgICAgICAgIG1hcChyZXN1bHQgPT4gKHsgc3RhdGU6ICdsb2FkZWQnIGFzIGNvbnN0LCByZXN1bHQgfSkpLFxuICAgICAgICAgICAgICBjYXRjaEVycm9yKGVycm9yID0+IG9mKHsgc3RhdGU6ICdsb2FkRmFpbGVkJyBhcyBjb25zdCwgZXJyb3IgfSkpLFxuICAgICAgICAgICAgICBzdGFydFdpdGgoeyBzdGF0ZTogJ2xvYWRpbmcnIGFzIGNvbnN0IH0pLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApLFxuICAgICAgICAgIHRhcChsb2FkU3RhdGUgPT4ge1xuICAgICAgICAgICAgaWYgKGxvYWRTdGF0ZS5zdGF0ZSAhPT0gJ2xvYWRpbmcnICYmICF0aGlzLnZhbGlkYXRvcihsb2FkU3RhdGUpKSB7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHRoaXMuc3RvcmUuZW50cmllcygpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzRXF1YWwoa2V5LCBwYXJhbXMpKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLmZpbmlzaCgpO1xuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSksXG4gICAgICAgICAgdGFrZVVudGlsKGZpbmlzaCQkKSxcbiAgICAgICAgICB0aGlzLnNoYXJlKCksXG4gICAgICAgICksXG4gICAgICB9O1xuXG4gICAgICB0aGlzLnN0b3JlLnNldChwYXJhbXMsIGNhY2hlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY2FjaGUubG9hZFN0YXRlO1xuICB9XG5cbiAgZmV0Y2gocGFyYW1zOiBQKSB7XG4gICAgcmV0dXJuIHRoaXMuZmV0Y2hTdGF0ZShwYXJhbXMpLnBpcGUoXG4gICAgICBmaWx0ZXIobG9hZFN0YXRlID0+IGxvYWRTdGF0ZS5zdGF0ZSA9PT0gJ2xvYWRlZCcpLFxuICAgICAgbWFwKGxvYWRTdGF0ZSA9PiBsb2FkU3RhdGUucmVzdWx0KSxcbiAgICApO1xuICB9XG5cbiAgcmVmZXRjaChwYXJhbXM6IFApIHtcbiAgICB0aGlzLmdldChwYXJhbXMpPy5yZWZldGNoKCk7XG4gIH1cblxuICByZWZldGNoQWxsKCkge1xuICAgIHRoaXMuZm9yRWFjaChjYWNoZSA9PiB7XG4gICAgICBjYWNoZS5yZWZldGNoKCk7XG4gICAgfSk7XG4gIH1cblxuICBnZXQocGFyYW1zOiBQKSB7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5zdG9yZS5lbnRyaWVzKCkpIHtcbiAgICAgIGlmIChpc0VxdWFsKGtleSwgcGFyYW1zKSkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaGFzKHBhcmFtczogUCkge1xuICAgIHJldHVybiAhIXRoaXMuZ2V0KHBhcmFtcyk7XG4gIH1cblxuICBkZWxldGUocGFyYW1zOiBQKSB7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5zdG9yZS5lbnRyaWVzKCkpIHtcbiAgICAgIGlmIChpc0VxdWFsKGtleSwgcGFyYW1zKSkge1xuICAgICAgICB0aGlzLnN0b3JlLmRlbGV0ZShrZXkpO1xuICAgICAgICB2YWx1ZS5maW5pc2goKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNsZWFyKCkge1xuICAgIHRoaXMuc3RvcmUuZm9yRWFjaCh2YWx1ZSA9PiB7XG4gICAgICB2YWx1ZS5maW5pc2goKTtcbiAgICB9KTtcbiAgICB0aGlzLnN0b3JlLmNsZWFyKCk7XG4gIH1cblxuICBmb3JFYWNoID0gdGhpcy5zdG9yZS5mb3JFYWNoLmJpbmQodGhpcy5zdG9yZSk7XG5cbiAgZW50cmllcyA9IHRoaXMuc3RvcmUuZW50cmllcy5iaW5kKHRoaXMuc3RvcmUpO1xuXG4gIHZhbHVlcyA9IHRoaXMuc3RvcmUudmFsdWVzLmJpbmQodGhpcy5zdG9yZSk7XG5cbiAga2V5cyA9IHRoaXMuc3RvcmUua2V5cy5iaW5kKHRoaXMuc3RvcmUpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENhY2hlU3RvcmVPcHRpb25zPFAsIFY+IHtcbiAgZmV0Y2hlcjogKHBhcmFtczogUCkgPT4gT2JzZXJ2YWJsZTxWPjtcbiAgc2hhcmU/OiA8VD4oKSA9PiBNb25vVHlwZU9wZXJhdG9yRnVuY3Rpb248VD47XG4gIHZhbGlkYXRvcj86IChsb2FkU3RhdGU6IENhY2hlTG9hZFN0YXRlPFY+KSA9PiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENhY2hlTG9hZFN0YXRlPFY+IHtcbiAgc3RhdGU6ICdsb2FkaW5nJyB8ICdsb2FkZWQnIHwgJ2xvYWRGYWlsZWQnO1xuICByZXN1bHQ/OiBWO1xuICBlcnJvcj86IHVua25vd247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FjaGU8Vj4ge1xuICBsb2FkU3RhdGU6IE9ic2VydmFibGU8Q2FjaGVMb2FkU3RhdGU8Vj4+O1xuICByZWZldGNoOiAoKSA9PiB2b2lkO1xuICBmaW5pc2g6ICgpID0+IHZvaWQ7XG59XG4iXX0=