Files
next.js/test/e2e/custom-cache-handler-image/cache-handler.js
Arian Tron 61f56f997c
Some checks failed
Test examples / Test Examples (20) (push) Has been cancelled
Test examples / Test Examples (22) (push) Has been cancelled
Lock Threads / action (push) Has been cancelled
Trigger Release / start (push) Has been cancelled
Stale issue handler / stale (push) Has been cancelled
Update Font Data / create-pull-request (push) Has been cancelled
build-and-deploy / deploy-target (push) Has been cancelled
build-and-deploy / build (push) Has been cancelled
build-and-deploy / stable - aarch64-unknown-linux-musl - node@16 (push) Has been cancelled
build-and-deploy / stable - x86_64-unknown-linux-musl - node@16 (push) Has been cancelled
build-and-deploy / stable - aarch64-unknown-linux-gnu - node@16 (push) Has been cancelled
build-and-deploy / stable - x86_64-unknown-linux-gnu - node@16 (push) Has been cancelled
build-and-deploy / stable - aarch64-pc-windows-msvc - node@16 (push) Has been cancelled
build-and-deploy / stable - x86_64-pc-windows-msvc - node@16 (push) Has been cancelled
build-and-deploy / stable - aarch64-apple-darwin - node@16 (push) Has been cancelled
build-and-deploy / stable - x86_64-apple-darwin - node@16 (push) Has been cancelled
build-and-deploy / build-wasm (nodejs) (push) Has been cancelled
build-and-deploy / build-wasm (web) (push) Has been cancelled
build-and-deploy / Deploy preview tarball (push) Has been cancelled
build-and-deploy / Potentially publish release (push) Has been cancelled
build-and-deploy / publish-turbopack-npm-packages (push) Has been cancelled
build-and-deploy / Deploy examples (push) Has been cancelled
build-and-deploy / thank you, build (push) Has been cancelled
build-and-deploy / Upload Turbopack Bytesize metrics to Datadog (push) Has been cancelled
Rspack Next.js development integration tests / Rspack integration tests (push) Has been cancelled
Rspack Next.js production integration tests / Rspack integration tests (push) Has been cancelled
Turbopack Next.js development integration tests / Next.js integration tests (push) Has been cancelled
Turbopack Next.js production integration tests / Next.js integration tests (push) Has been cancelled
Update Rspack test manifest / Update and upload Rspack development test manifest (push) Has been cancelled
Update Rspack test manifest / Update and upload Rspack production test manifest (push) Has been cancelled
Upload bundler test manifests to areweturboyet.com / Upload test results (push) Has been cancelled
Update React / create-pull-request (push) Has been cancelled
test-e2e-project-reset-cron / reset-test-project (push) Has been cancelled
Notify about the top 15 issues/PRs/feature requests (most reacted) in the last 90 days / run (push) Has been cancelled
first commit
2026-03-10 19:37:31 +03:30

106 lines
2.4 KiB
JavaScript

/**
* Simple LRU cache handler with max entries eviction policy.
* When the cache exceeds maxEntries, the least recently used entries are evicted.
*/
const MAX_IMAGE_ENTRIES = parseInt(
process.env.MAX_IMAGE_CACHE_ENTRIES || '2',
10
)
class LRUCache {
constructor(maxEntries) {
this.maxEntries = maxEntries
this.cache = new Map()
}
get(key) {
if (!this.cache.has(key)) {
return undefined
}
// Move to end (most recently used)
const value = this.cache.get(key)
this.cache.delete(key)
this.cache.set(key, value)
return value
}
set(key, value) {
// If key exists, delete it first (will be re-added at end)
if (this.cache.has(key)) {
this.cache.delete(key)
}
// Evict oldest entries if at capacity
while (this.cache.size >= this.maxEntries) {
const oldestKey = this.cache.keys().next().value
console.log('cache-handler evicting', oldestKey)
this.cache.delete(oldestKey)
}
this.cache.set(key, value)
}
has(key) {
return this.cache.has(key)
}
get size() {
return this.cache.size
}
keys() {
return Array.from(this.cache.keys())
}
}
// Separate caches for different kinds
const imageCache = new LRUCache(MAX_IMAGE_ENTRIES)
const pageCache = new LRUCache(100) // Higher limit for pages
class CacheHandler {
constructor(options) {
this.options = options
console.log('initialized custom cache-handler')
console.log('max image cache entries:', MAX_IMAGE_ENTRIES)
}
async get(key, ctx) {
const kind = ctx?.kind
console.log('cache-handler get', key, 'kind:', kind)
const cache = kind === 'IMAGE' ? imageCache : pageCache
const entry = cache.get(key)
if (entry) {
console.log('cache-handler hit', key)
return entry
}
console.log('cache-handler miss', key)
return null
}
async set(key, data, ctx) {
const kind = data?.kind
console.log('cache-handler set', key, 'kind:', kind)
const cache = kind === 'IMAGE' ? imageCache : pageCache
cache.set(key, {
value: data,
lastModified: Date.now(),
})
if (kind === 'IMAGE') {
console.log('cache-handler image cache size:', imageCache.size)
console.log(
'cache-handler image cache keys:',
imageCache.keys().join(', ')
)
}
}
async revalidateTag(tags) {
console.log('cache-handler revalidateTag', tags)
}
}
module.exports = CacheHandler