A simple-to-use, minimal boilerplate flexible cached state.
✅ Caching
✅ State Management
✅ Updates for cache consumers
✅ Works with any framework
✅ Local Storage Support
✅ Custom Storage Asynchronous Support
✅ Handles Simultaneous Requests
✅ Automatic & Manual Cache Busting
✅ Aspect-Oriented (Decorators)
✅ Out-of-the-box LocalStorage and SessionStorage cache data storage
$ npm i --save @coool/cachestateimport { CacheState } from '@coool/cachestate';
@CacheState()
function getItem$(itemId: ItemId): Observable<Item> {
// Get latest version of item from the server
}getItem$('1')
.subscribe(item => {
// You'll receive initial cached value and updates here
});import { CacheState, CacheStateUpdater } from '@coool/cachestate';
@CacheState({
updatedNotifierKey: 'items-updated',
})
function getItem$(itemId: ItemId): Observable<Item> {
// Get latest version of item from the server
}
@CacheStateUpdater({
updatedNotifierKey: 'items-updated',
})
function updateItem() {
// This will invalidate the cache and call the getItem$ function again then update cache consumers with the latest value
}You can set configurations globally across all CacheStates. Local configuration will take precedence over global configuration.
import { GlobalCacheStateConfig } from '@coool/cachestate';
GlobalCacheStateConfig.maxAgeMS = 5 * 60 * 1000;import { CacheState, CacheStateInvalidator } from '@coool/cachestate';
import { Subject } from 'rxjs';
const cacheInvalidatedNotifier = new Subject<void>();
@CacheState({
invalidatedNotifier: cacheInvalidatedNotifier,
})
function getItem$(itemId: ItemId): Observable<Item> {
}
@CacheStateInvalidator({
invalidatedNotifier: cacheInvalidatedNotifier,
})
function updateItem() {
// This will invalidate the cache and call the getItem$ function again then update cache consumers with the latest value
}import { invalidateAllCache } from '@coool/cachestate';
invalidateAllCache();import { invalidateAndUpdateAllCache } from '@coool/cachestate';
invalidateAndUpdateAllCache();import { GlobalCacheStateConfig, BrowserStorageCacheDataStorage } from '@coool/cachestate';
GlobalCacheStateConfig.cacheDataStorage = new BrowserStorageCacheDataStorage(window.localStorage);import { GlobalCacheStateConfig, BrowserStorageCacheDataStorage } from '@coool/cachestate';
GlobalCacheStateConfig.cacheDataStorage = new BrowserStorageCacheDataStorage(window.sessionStorage);import { CacheDataStorage, GlobalCacheStateConfig } from '@coool/cachestate';
class MyCacheDataStorage implements CacheDataStorage {
// Implement CacheDataStorage interface to store, retrieve and delete cache data
}
GlobalCacheStateConfig.cacheDataStorage = new MyCacheDataStorage();| Property | Description | Default | Required |
|---|---|---|---|
| cacheKey.generator | Generates the cache key | Combination of cache key prefix and suffix (combination of class, method name and a hash of the function's arguments) | false |
| cacheKey.prefixGenerator | Prefix for the cache key | Combination of class and method name | false |
| cacheKey.suffixGenerator | Suffix for the cache key | A hash of the function's arguments | false |
| cacheDataStorage | A storage where the cache data is stored | Store cached values locally | false |
| maxAgeMS | Max age of cache in milliseconds | 60000 (1 minute) | false |
| updatedObservable | When emits the cache is invalidated and updated. If CacheKey is passed then only that cache otherwise all related cache. | undefined | false |
| updatedObservableKey | When emits the cache is invalidated and updated. If CacheKey is passed then only that cache otherwise all related cache. | undefined | false |
| updateOnlySpecific | When updated notifier fires only update if specific cache key is defined. | false | false |
| invalidatedObservable | When emits the cache is invalidated. If CacheKey is passed then only that cache otherwise all related cache. | undefined | false |
| invalidatedObservableKey | When emits the cache is invalidated. If CacheKey is passed then only that cache otherwise all related cache. | undefined | false |
| invalidateOnlySpecific | When invalidated notifier fires only update if specific cache key is defined. | false | false |
| timestampProvider | Provides current timestamp, useful for testing | false |
| Property | Description | Default | Required |
|---|---|---|---|
| updatedNotifier | When emits the cache is invalidated and updated. If CacheKey is passed then only that cache otherwise all related cache. | undefined | true (OR use updatedNotifierKey) |
| updatedNotifierKey | Global key identifying updatedNotifier | undefined | true (OR use updatedNotifier) |
| cacheKeyGenerator | Generates the cache key for the updated notifier | undefined | false |
| Property | Description | Default | Required |
|---|---|---|---|
| invalidatedNotifier | When emits the cache is invalidated. If CacheKey is passed then only that cache otherwise all related cache. | undefined | true (OR use invalidatedNotifierKey) |
| invalidatedNotifierKey | Global key identifying invalidatedNotifier. | undefined | true (OR use invalidatedNotifier) |
| cacheKeyGenerator | Generates the cache key for the updated notifier | undefined | false |
| Property | Description | Default | Required |
|---|---|---|---|
| cacheDataStorage | A storage where the cache data is stored | Store cached values locally | false |
| maxAgeMS | Max age of cache in milliseconds | 60000 (1 minute) | false |
| timestampProvider | Provides current timestamp, useful for testing | false |
This project is inspired by ts-cacheable