
Security News
Frontier AI Is Now Critical Infrastructure
The Fable shutdown shows how quickly model access can become a business continuity risk for AI-dependent engineering teams.
@sebspark/promise-cache
Advanced tools
Simple caching wrapper for promises, backed by Redis or in-memory storage.
@sebspark/promise-cacheSimple caching wrapper for promises, backed by Redis or in-memory storage.
yarn add @sebspark/promise-cache @sebspark/memredis
MemRedis for in-memory/testingcreateCache(persistor, 'optional-prefix')cache.wrap(fn, options)import { createClient } from 'redis'
import { createCache } from '@sebspark/promise-cache'
import { myFunction } from './some_function'
const run = async () => {
const persistor = createClient({ url: 'redis://localhost:6379' })
await persistor.connect() // connection is not managed by the cache
const cache = createCache(persistor, 'my-prefix')
const myCachedFunction = cache.wrap(myFunction, {
key: 'my-function', // stored as 'my-prefix:my-function'
expiry: 100, // ttl in ms
})
const response = await myCachedFunction()
}
run()
import { MemRedis } from '@sebspark/memredis'
import { createCache } from '@sebspark/promise-cache'
import { myFunction } from './some_function'
const run = async () => {
const persistor = new MemRedis()
await persistor.connect()
const cache = createCache(persistor, 'my-prefix')
const myCachedFunction = cache.wrap(myFunction, {
key: 'my-function',
expiry: 100,
})
const response = await myCachedFunction()
}
run()
Note:
InMemoryPersistoris re-exported from this package as an alias forMemRedisfor backwards compatibility, but prefer importingMemRedisdirectly from@sebspark/memredis.
Keys can be constructed in two ways: as a fixed string or as a function that generates a string. The generator will accept the arguments of the wrapped function.
const cache = createCache(persistor, 'api')
const getById = async (id: string): Promise<Data> => {
// Something gets called
}
const cachedGetById = cache.wrap(myApiCall, {
key: (id) => `getById:${id}`
})
const result = await cachedGetById('foo')
// key will be 'api:getById:foo'
Expiration can be set as either a number (number of milliseconds from now) or a Date (exact expiry time). It can be set either as a value (number | Date) or as a function that generates a value (number | Date). The generator will accept the arguments and the response of the wrapped function.
const cache = createCache(persistor, 'api')
type Data = {
value: number
expires: string // ISO6501 date time string
}
const getById = async (id: string): Promise<Data> => {
// Something gets called
}
const cachedGetById = cache.wrap(myApiCall, {
key: (id) => `getById:${id}`,
expires: ([id], data) => new Date(data.expires),
})
const result = await cachedGetById('foo')
There are also helpers for setting time or manipulating dates
import { createCache, time } from '@sebspark/promise-cache'
const cache = createCache(persistor, 'api')
type Data = {
value: number
lastUpdated: string // ISO6501 date time string. Data is updated every 30 minutes.
}
const getById = async (id: string): Promise<Data> => {
// Something gets called
}
// Computed from response
const cachedGetById = cache.wrap(myApiCall, {
key: (id) => `getById:${id}`,
expires: ([id], data) => time.add(new Date(data.lastUpdated), { minutes: 30 })
})
// Fixed at 20 seconds
const cachedGetById = cache.wrap(myApiCall, {
key: (id) => `getById:${id}`,
expires: time.seconds(100),
})
// Fixed at today 20:00:00 UTC
const cachedGetById = cache.wrap(myApiCall, {
key: (id) => `getById:${id}`,
expires: time.today(20),
})
// Fixed at tomorrow 00:00:00
const cachedGetById = cache.wrap(myApiCall, {
key: (id) => `getById:${id}`,
expires: time.tomorrow(),
})
If expiry is not set or yields an unusable value, it will default to 1 sec.
FAQs
Simple caching wrapper for promises, backed by Redis or in-memory storage.
We found that @sebspark/promise-cache demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 3 open source maintainers 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
The Fable shutdown shows how quickly model access can become a business continuity risk for AI-dependent engineering teams.

Security News
AI agents are pulling packages into environments no scanner is watching, creating exposure before security teams can see it.

Security News
GitHub Actions checkout now blocks risky pull_request_target checkouts by default to help prevent pwn request supply chain attacks.