node-ts-cache
Version:
Simple and extensible caching module supporting decorators
105 lines (75 loc) • 3.84 kB
Markdown
[](https://github.com/havsar/node-ts-cache/actions/workflows/ci.yml)
[](https://github.com/havsar/node-ts-cache/actions/workflows/ci.yml)
[](https://www.npmjs.org/package/node-ts-cache)
[](http://opensource.org/licenses/MIT)
[](https://nodei.co/npm/node-ts-cache/)
# node-ts-cache
Simple and extensible caching module supporting decorators.
# Install
```bash
npm install node-ts-cache
```
_Note: The underlying storage layer must be installed separately._
# Storages
| Storage | Install |
|----------------------------------------------------------------------- |------------------------------------------------- |
| [memory](https://www.npmjs.com/package/node-ts-cache-storage-memory) | ```npm install node-ts-cache-storage-memory``` |
| [node-fs](https://www.npmjs.com/package/node-ts-cache-storage-node-fs) | ```npm install node-ts-cache-storage-node-fs``` |
| [ioredis](https://www.npmjs.com/package/node-ts-cache-storage-ioredis) | ```npm install node-ts-cache-storage-ioredis``` |
# Usage
## With decorator
Caches function response using the given options.
Works with the above listed storages.
By default, uses all arguments to build an unique key.
`@Cache(container, options)`
- `options`:
- `ttl`: _(Default: 60)_ Number of seconds to expire the cachte item
- `isLazy`: _(Default: true)_ If true, expired cache entries will be deleted on touch. If false, entries will be deleted after the given _ttl_.
- `isCachedForever`: _(Default: false)_ If true, cache entry has no expiration.
- `calculateKey(data => string)`: _(Default: JSON.stringify combination of className, methodName and call args)_
- `data`:
- `className`: The class name for the method being decorated
- `methodName`: The method name being decorated
- `args`: The arguments passed to the method when called
_Note: @Cache will consider the return type of the function. If the return type is a thenable, it will stay that way, otherwise not._
```ts
import { Cache, CacheContainer } from 'node-ts-cache'
import { MemoryStorage } from 'node-ts-cache-storage-memory'
const userCache = new CacheContainer(new MemoryStorage())
class MyService {
@Cache(userCache, {ttl: 60})
public async getUsers(): Promise<string[]> {
return ["Max", "User"]
}
}
```
## Directly
```ts
import { CacheContainer } from 'node-ts-cache'
import { MemoryStorage } from 'node-ts-cache-storage-memory'
const myCache = new CacheContainer(new MemoryStorage())
class MyService {
public async getUsers(): Promise<string[]> {
const cachedUsers = await myCache.getItem<string[]>("users")
if (cachedUsers) {
return cachedUsers
}
const newUsers = ["Max", "User"]
await myCache.setItem("users", newUsers, {ttl: 60})
return newUsers
}
}
```
# Logging
This project uses [debug](https://github.com/visionmedia/debug) to log useful caching information.
Set environment variable **DEBUG=node-ts-cache** to enable logging.
# Development & Testing
This project follows the monorepo architecture using [lerna](https://github.com/lerna/lerna).
To start development and run tests for all the packages, run:
```bash
git clone git@github.com:havsar/node-ts-cache.git
cd node-ts-cache
npm i
npm run bootstrap
npm run test
```