
Security News
arXiv Is Rate Limiting Authors Following a Flood of AI Slop Submissions
arXiv now limits authors to two submissions a month as AI slop overwhelms moderators, delays good papers, and sparks debate over applying the limit to everyone.
@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
Unknown package
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.

Security News
arXiv now limits authors to two submissions a month as AI slop overwhelms moderators, delays good papers, and sparks debate over applying the limit to everyone.

Research
/Security News
A new GhostAction wave hits hundreds of GitHub repos, expanding CI/CD secret theft to cloud and AI credentials in source code and git history.

Research
/Security News
Tensorlake npm SDK version 0.5.144 was compromised in a ChainDrop / Shai-Hulud attack, delivering credential-stealing malware.