Jules
Initial clean CRM deployment with prebuilt assets
d9494a5
Raw
History Blame Contribute Delete
1.99 kB
import { detectPdf } from '@file-type/pdf';
import { type AxiosInstance } from 'axios';
import { isNonEmptyString } from '@sniptt/guards';
import { FileTypeParser } from 'file-type';
import { isDefined } from 'twenty-shared/utils';
export const getImageBufferFromUrl = async (
url: string,
axiosInstance: AxiosInstance,
): Promise<Buffer> => {
if (!isNonEmptyString(url) || url.trim().length === 0) {
throw new Error('Invalid URL provided: URL must be a non-empty string');
}
try {
const response = await axiosInstance.get(url, {
responseType: 'arraybuffer',
validateStatus: (status) => status >= 200 && status < 300,
maxRedirects: 5,
timeout: 10000,
});
if (!response.data) {
throw new Error('Received empty response from image URL');
}
const bufferLength = Buffer.isBuffer(response.data)
? response.data.length
: response.data.byteLength;
if (bufferLength === 0) {
throw new Error('Received empty response from image URL');
}
const contentType = response.headers['content-type'];
if (isNonEmptyString(contentType) && !contentType.startsWith('image/')) {
throw new Error(
`Invalid content type: expected image/*, got ${contentType}`,
);
}
return Buffer.from(response.data, 'binary');
} catch (error) {
const message = error instanceof Error ? error.message : 'Unknown error';
throw new Error(`Failed to fetch image from ${url}: ${message}`);
}
};
export const fetchImageWithTypeFromUrl = async (
imageUrl: string,
axiosInstance: AxiosInstance,
): Promise<{ buffer: Buffer; extension: string } | undefined> => {
const buffer = await getImageBufferFromUrl(imageUrl, axiosInstance);
const parser = new FileTypeParser({ customDetectors: [detectPdf] });
const type = await parser.fromBuffer(buffer);
if (!isDefined(type) || !type.mime.startsWith('image/')) {
return undefined;
}
return { buffer, extension: type.ext };
};