@alauda-fe/common
Version:
Alauda frontend team common codes.
82 lines • 12.4 kB
JavaScript
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=