gongxiangp2/lib/sharp-runtime.ts
2026-07-31 10:40:00 +08:00

44 lines
1.2 KiB
TypeScript

import sharp from 'sharp'
const DEFAULT_SHARP_CONCURRENCY = 1
const MAX_SHARP_CONCURRENCY = 2
const SHARP_CACHE_MEMORY_MB = 128
const SHARP_CACHE_ITEMS = 64
function readConcurrency(): number {
const configured = Number.parseInt(process.env.SHARP_CONCURRENCY || '', 10)
if (!Number.isFinite(configured)) {
return DEFAULT_SHARP_CONCURRENCY
}
return Math.max(1, Math.min(MAX_SHARP_CONCURRENCY, configured))
}
let configured = false
/**
* Sharp 的原生解码/编码内存不受 Node old-space 完全约束。
* 生产应用与 Next.js 共用一个容器,因此默认只允许一个 Sharp 任务,
* 并关闭磁盘缓存、限制内存缓存,避免并发图片请求把宿主机推入 OOM。
*/
export function configureSharpRuntime(): void {
if (configured) {
return
}
// 测试或极简运行时可能只提供 sharp() 工厂,没有全局调优方法;
// 这时保留原有行为,不让配置本身阻断业务。
if (typeof sharp.concurrency !== 'function' || typeof sharp.cache !== 'function') {
configured = true
return
}
sharp.concurrency(readConcurrency())
sharp.cache({
memory: SHARP_CACHE_MEMORY_MB,
items: SHARP_CACHE_ITEMS,
files: 0,
})
configured = true
}