fix(redis): fix logs being polluted when redis is disabled

also used streaming when redis is disabled for faster response.
This commit is contained in:
zyachel
2022-11-13 17:29:47 +05:30
parent 6f664d2164
commit 5fd0d92187
7 changed files with 148 additions and 73 deletions

View File

@ -1,59 +1,71 @@
import { NextApiRequest, NextApiResponse } from 'next'
import redis from '../../utils/redis'
import axiosInstance from '../../utils/axiosInstance'
import { AxiosResponse } from 'axios'
import { NextApiRequest, NextApiResponse } from 'next';
import redis from '../../utils/redis';
import axiosInstance from '../../utils/axiosInstance';
const regex =
/^https:\/\/((m\.)?media-amazon\.com|imdb-video\.media-imdb\.com).*\.(jpg|jpeg|png|mp4|gif|webp).*$/
/^https:\/\/((m\.)?media-amazon\.com|imdb-video\.media-imdb\.com).*\.(jpg|jpeg|png|mp4|gif|webp).*$/;
export default async function handler(
req: NextApiRequest,
res: NextApiResponse
) {
const mediaUrl = req.query.url as string | undefined
try {
const mediaUrl = req.query.url as string | undefined;
if (!mediaUrl || !regex.test(mediaUrl))
return res.status(400).json({
success: false,
message: 'Invalid query',
})
// 1. returning if query is illegal
if (!mediaUrl || !regex.test(mediaUrl))
return res.status(400).json({
success: false,
message: 'Invalid query',
});
if (process.env.USE_REDIS === 'true') {
const cachedMedia = await redis.getBuffer(mediaUrl)
// 2. sending streamed response if redis isn't enabled
if (redis === null) {
const mediaRes = await axiosInstance.get(mediaUrl, {
responseType: 'stream',
});
res.setHeader('Content-Type', mediaRes.headers['content-type']);
mediaRes.data.pipe(res);
return;
}
// 3. else if resourced is cached, sending it
const cachedMedia = await redis!.getBuffer(mediaUrl);
if (cachedMedia) {
res.setHeader('x-cached', 'true')
res.status(302).send(cachedMedia)
return
res.setHeader('x-cached', 'true');
res.status(302).send(cachedMedia);
return;
}
}
let mediaRes: AxiosResponse
try {
mediaRes = await axiosInstance(mediaUrl, { responseType: 'arraybuffer' })
// 4. else getting, caching and sending response
const mediaRes = await axiosInstance(mediaUrl, {
responseType: 'arraybuffer',
});
const data = mediaRes.data;
// saving in redis for 30 minutes
await redis!.setex(mediaUrl, 30 * 60, Buffer.from(data));
// sending media
res.setHeader('x-cached', 'false');
res.send(data);
// sending token response on any error
} catch {
res.status(404)
res.status(404);
res.json({
success: false,
message: 'Error from IMDb',
})
return
message: 'something went wrong',
});
return;
}
const data = mediaRes.data
if (process.env.USE_REDIS === 'true') {
// save in redis for 30 minutes
await redis.setex(mediaUrl, 30 * 60, Buffer.from(data))
}
// send media
res.setHeader('x-cached', 'false')
res.send(data)
}
export const config = {
api: {
responseLimit: false,
},
}
};