diff --git a/src/api/middlewares/ImageProxy.ts b/src/api/middlewares/ImageProxy.ts
index 4c324afd..27c69ae2 100644
--- a/src/api/middlewares/ImageProxy.ts
+++ b/src/api/middlewares/ImageProxy.ts
@@ -16,14 +16,22 @@
along with this program. If not, see .
*/
-import { Config } from "@spacebar/util";
+import { Config, JimpType } from "@spacebar/util";
import { Request, Response } from "express";
import { yellow } from "picocolors";
import crypto from "crypto";
import fetch from "node-fetch";
let sharp: undefined | false | { default: typeof import("sharp") } = undefined;
-let Jimp: undefined | false | typeof import("jimp") = undefined;
+
+let Jimp: JimpType | undefined = undefined;
+try {
+ Jimp = require("jimp") as JimpType;
+} catch {
+ // empty
+}
+
+let sentImageProxyWarning = false;
const sharpSupported = new Set([
"image/jpeg",
@@ -112,20 +120,21 @@ export async function ImageProxy(req: Request, res: Response) {
const arrayBuffer = await request.arrayBuffer();
let resultBuffer = Buffer.from(arrayBuffer);
- if (/^\d+x\d+$/.test(path[1]) && resizeSupported.has(contentType)) {
+ if (!sentImageProxyWarning && resizeSupported.has(contentType) && /^\d+x\d+$/.test(path[1])) {
if (sharp !== false) {
try {
sharp = await import("sharp");
- } catch (e) {
+ } catch {
sharp = false;
}
}
- if (sharp === false && Jimp !== false) {
+
+ if (sharp === false && !Jimp) {
try {
// @ts-expect-error Typings don't fit
Jimp = await import("jimp");
} catch {
- Jimp = false;
+ sentImageProxyWarning = true;
console.log(
`[ImageProxy] ${yellow(
'Neither "sharp" or "jimp" NPM packages are installed, image resizing will be disabled',
diff --git a/src/util/imports/Jimp.ts b/src/util/imports/Jimp.ts
new file mode 100644
index 00000000..c1389e03
--- /dev/null
+++ b/src/util/imports/Jimp.ts
@@ -0,0 +1,23 @@
+/*
+ Spacebar: A FOSS re-implementation and extension of the Discord.com backend.
+ Copyright (C) 2023 Spacebar and Spacebar Contributors
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see .
+*/
+
+/* eslint-disable @typescript-eslint/no-explicit-any */
+
+export type JimpType = {
+ read: (data: Buffer) => Promise;
+};
diff --git a/src/util/imports/index.ts b/src/util/imports/index.ts
index 08b870bc..4bc5a6c5 100644
--- a/src/util/imports/index.ts
+++ b/src/util/imports/index.ts
@@ -18,3 +18,4 @@
export * from "./OrmUtils";
export * from "./Erlpack";
+export * from "./Jimp";