TS decorator for caching logic of API calls.
npm install @kovalenko/http-request-cacheTS decorator for caching logic of API calls.
Inspired by How to use TS decorators to add caching logic to API calls
```
npm install @kovalenko/http-request-cache
@HttpRequestCache — A method decorator that will cache data
thisObj is this object
args are decorated method's arguments
`typescriptrefCount
interface HttpCacheOptions {
refCount?: boolean; // If is true, the source will be unsubscribed from once the reference count drops to zero`
windowTime?: number; // Maximum time length of the replay buffer in milliseconds
ttl?: number; // cache time to live before it will be refreshed. Unlike refreshOn: interval(1000), ttl will not refresh automatically
storage?: HttpCacheStorage; // if none specified, the default cache object will be used
refreshOn?: Observable
}
`typescript`
export interface HttpCacheStorage {
setItem(key: string, item: Observable
getItem(key: string): Observable
deleteItem(key: string): void; // deletes cache
}
`typescript
@Injectable()
export class DataService {
refresh$ = new Subject();
constructor(private http: HttpClient) { }
@HttpRequestCache
refreshOn: dataService.refresh$
}))
list(): Observable
return this.http.get('assets/angular.json');
}
}
`
`typescript
@Injectable()
export class DataService {
constructor(private http: HttpClient) { }
@HttpRequestCache
refCount: true // set refCount to true to unsubscribe cache
}))
list(): Observable
return this.http.get('assets/angular.json');
}
}
`
`typescript
@Injectable()
export class DataService {
refresh$ = new Subject();
constructor(private http: HttpClient, private cacheService: CacheService) { }
@HttpRequestCache
storage: dataService.cacheService,
refreshOn: dataService.refresh$
}))
list(): Observable
return this.http.get('assets/angular.json');
}
}
`
`typescript
@Injectable()
export class DataService {
refresh$ = new Subject
constructor(private http: HttpClient) { }
@HttpRequestCache
refreshOn: dataService.refresh$.pipe(filter(r => r === id))
}))
list(id: string): Observable
return this.http.get('assets/angular.json');
}
}
`
When someone subscribes list() method after TTL period, every subscription is being refreshed
`typescript
@Injectable()
export class DataService {
constructor(private http: HttpClient) { }
@HttpRequestCache(() => ({
ttl: 5000
}))
list(): Observable
return this.http.get('assets/angular.json');
}
}
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss'],
})
export class AppComponent implements OnInit {
constructor(
private http: HttpClient,
private dataService: DataService
) { }
ngOnInit(): void {
this.dataService.list().subscribe(g => {
console.log('1', g);
});
// outputs:
// 1 {...}
setTimeout(() => {
this.dataService.list().subscribe(g => {
console.log('2', g);
});
}, 1000);
// outputs:
// 2 {...}
setTimeout(() => {
this.dataService.list().subscribe(g => {
console.log('3', g);
});
}, 6000);
// outputs:
// 1 {...}
// 2 {...}
// 3 {...}
setTimeout(() => {
this.dataService.list().subscribe(g => {
console.log('4', g);
});
}, 8000);
// outputs:
// 4 {...}
}
}
`
typescript
@Injectable()
export class DataService {
constructor(private http: HttpClient) { } @HttpRequestCache()
list(): Observable {
return this.http.get('assets/angular.json');
}
}
``