Security News
Fluent Assertions Faces Backlash After Abandoning Open Source Licensing
Fluent Assertions is facing backlash after dropping the Apache license for a commercial model, leaving users blindsided and questioning contributor rights.
@isaacs/cached
Advanced tools
Cache a function that takes a path as an argument, expiring whenever the file mtime changes
Cache the results of a function based on a path
argument, and
clear the cache whenever the mtime of the path changes.
import { cachedMtime } from '@isaacs/cached'
import { writeFile, readFile } from 'node:fs/promises'
const readFileCached = cachedMtime(readFile)
// first time, actually reads the file
const results = await readFileCached('file.txt')
// second time, just serve from cache
const cachedResults = await readFileCached('file.txt')
// file changes!
await writeFile('file.txt', 'new contents')
const cacheBusted = await readFileCached('file.txt')
The cached
method is the same thing, but without the mtime
stuff, so you'd have to expire the cache yourself if you want to
do that.
import { cached } from '@isaacs/cached'
import { writeFile, readFile } from 'node:fs/promises'
const readFileCached = cached(readFile)
await writeFile('file.txt', 'some contents')
// first time, actually reads the file
const results = await readFileCached('file.txt')
// second time, just serve from cache
const cachedResults = await readFileCached('file.txt')
// file changes! but this is ignored, because we're using
// cached(), not cachedMtime()
await writeFile('file.txt', 'new contents')
const cacheNotBusted = await readFileCached('file.txt')
assert.equal(cacheNotBusted, 'some contents')
You can supply your own cache to the method if you'd like to use an LRU or something. It must implement get, set, and has, at minimum.
import { cached } from '@isaacs/cached'
const map1 = new Map([
[1, 11],
[2, 22],
])
const map2 = new Map([
[3, 13],
[4, 14],
])
const myCache = {
get: key => map1.get(key) || map2.get(key),
set: (key, value) => map1.set(key),
has: key => map1.has(key) || map2.has(key),
delete: key => map1.delete(key) || map2.delete(key),
}
const cachedFunction = cached(key => key * 100)
assert.equal(cachedFunction(1), 11)
assert.equal(cachedFunction(4), 14)
assert.equal(cachedFunction(5), 500)
assert.equal(map1.get(5), 500) // cached now
If you want to interact with the cache (and in the case of
cachedMtime
, the mtime cache) then that's hanging on the
returned function. You can use this to pre-seed cached values,
clear the cache in a targetted way, etc.
import { cachedMtime } from '@isaacs/cached'
import { writeFile, readFile } from 'node:fs/promises'
const readFileCached = cachedMtime(readFile)
await readFileCached('file.txt')
console.log(readFileCached.cache) // Map { 'file.txt' => 'some contents' }
console.log(readFileCached.mtimeCache) // Map { 'file.txt' => 853283471948 }
You can set the minimum time between stat calls, and optionally provide your own cache map objects for the return values and for the mtime values.
import { cachedMtime } from '@isaacs/cached'
import { readFileSync } from 'node:fs'
const mtimes = new Map<string, number>
const contents = new Map<string, string>
const cached = cachedMtime(
(path: string) => readFileSync(path, 'utf8'),
1000, // check for mtime changes at most 1ce per second
contents,
mtimes
)
See the typedocs for more information.
FAQs
Cache a function that takes a path as an argument, expiring whenever the file mtime changes
The npm package @isaacs/cached receives a total of 9,241 weekly downloads. As such, @isaacs/cached popularity was classified as popular.
We found that @isaacs/cached demonstrated a not healthy version release cadence and project activity because the last version was released 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
Fluent Assertions is facing backlash after dropping the Apache license for a commercial model, leaving users blindsided and questioning contributor rights.
Research
Security News
Socket researchers uncover the risks of a malicious Python package targeting Discord developers.
Security News
The UK is proposing a bold ban on ransomware payments by public entities to disrupt cybercrime, protect critical services, and lead global cybersecurity efforts.