import axios from 'axios'; import AbortController from 'abort-controller'; import FileType from 'file-type'; export const allowedFormats = ['jpg', 'jpeg', 'png']; export const requestWaitingTimeInMs = 3 * 1000; /** * This function checks does an image available by url */ export const checkImageUrl = async (url: string): Promise => new Promise((resolve) => { try { (async () => { const controller = new AbortController(); const { signal } = controller; const timeout = setTimeout(() => { controller.abort(); }, requestWaitingTimeInMs); signal.addEventListener('abort', () => { console.log( `Request to URL ${url} cancelled due to server not responding` ); resolve(null); }); const req = await axios.get(url, { responseType: 'arraybuffer', signal, }); clearTimeout(timeout); const buffer = Buffer.from(req.data, 'binary'); const fileData = await FileType.fromBuffer(buffer); const { ext, mime } = fileData ?? {}; if (ext === undefined || mime === undefined) { return resolve(false); } const fileType = mime.split('/')[0]; if (fileType !== 'image') { return resolve(false); } if (allowedFormats.includes(ext) === false) { return resolve(false); } return resolve(true); })(); } catch (error) { console.error(error); return resolve(null); } });