






















@@ -205,6 +205,23 @@ function formatCapReduce(label: string, cap: number, size: number): string {
205205return `${label} could not be reduced below ${formatMb(cap, 0)}MB (got ${formatMb(size)}MB)`;
206206}
207207208+function isOptionalImageOptimizerUnavailable(err: unknown): boolean {
209+const messages: string[] = [];
210+let current: unknown = err;
211+while (current instanceof Error) {
212+messages.push(current.message);
213+current = current.cause;
214+}
215+const detail = messages.join("\n").toLowerCase();
216+return (
217+detail.includes("optional dependency sharp is required") ||
218+detail.includes("cannot find package 'sharp'") ||
219+detail.includes('cannot find package "sharp"') ||
220+detail.includes("cannot find module 'sharp'") ||
221+detail.includes('cannot find module "sharp"')
222+);
223+}
224+208225function isHeicSource(opts: { contentType?: string; fileName?: string }): boolean {
209226if (opts.contentType && HEIC_MIME_RE.test(opts.contentType.trim())) {
210227return true;
@@ -392,7 +409,25 @@ async function loadWebMediaInternal(
392409meta?: { contentType?: string; fileName?: string },
393410) => {
394411const originalSize = buffer.length;
395-const optimized = await optimizeImageWithFallback({ buffer, cap, meta });
412+let optimized: OptimizedImage;
413+try {
414+optimized = await optimizeImageWithFallback({ buffer, cap, meta });
415+} catch (err) {
416+if (isOptionalImageOptimizerUnavailable(err) && buffer.length <= cap) {
417+if (shouldLogVerbose()) {
418+logVerbose(
419+`Image optimizer unavailable; sending original ${formatMb(buffer.length)}MB media without optimization`,
420+);
421+}
422+return {
423+ buffer,
424+contentType: meta?.contentType,
425+kind: "image" as const,
426+fileName: meta?.fileName,
427+};
428+}
429+throw err;
430+}
396431logOptimizedImage({ originalSize, optimized });
397432398433if (optimized.buffer.length > cap) {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。