
Security News
Attackers Are Hunting High-Impact Node.js Maintainers in a Coordinated Social Engineering Campaign
Multiple high-impact npm maintainers confirm they have been targeted in the same social engineering campaign that compromised Axios.
@coool/cachestate
Advanced tools
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/cachestate
import { 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
FAQs
A simple-to-use, minimal boilerplate flexible cached state.
We found that @coool/cachestate demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
Multiple high-impact npm maintainers confirm they have been targeted in the same social engineering campaign that compromised Axios.

Security News
Axios compromise traced to social engineering, showing how attacks on maintainers can bypass controls and expose the broader software supply chain.

Security News
Node.js has paused its bug bounty program after funding ended, removing payouts for vulnerability reports but keeping its security process unchanged.