You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

103 lines
2.4 KiB

1 month ago
import axios from "axios";
import express, { json, query } from "express";
import Queue from "bull";
import Bottleneck from "bottleneck";
const app = express();
app.use(json());
const requestQueue = new Queue("request-queue");
const limiter = new Bottleneck({
maxConcurrent: 2, // Number of concurrent requests
minTime: 1, // Minimum time between requests (in milliseconds)
});
async function sendRequest(data) {
const botToken = data.botToken;
const chatId = data.chatId;
const text = data.text;
try {
const response = await axios.post(
`https://api.telegram.org/bot${botToken}/sendMessage`,
{
chat_id: chatId,
text: text,
}
);
} catch (error) {
console.error(
"Error:",
error.response ? error.response.data : error.message
);
}
}
requestQueue.process(async (job) => {
try {
const result = await limiter.schedule(() => sendRequest(job.data));
return result;
} catch (error) {
throw new Error(`Request failed: ${error.message}`);
}
});
// Handle job completion
requestQueue.on("completed", (job) => {
console.log(`Job ${job.id} completed successfully.`);
});
// Handle job failure and retry
requestQueue.on("failed", (job, error) => {
console.log(`Job ${job.id} failed with error: ${error.message}`);
if (job.attemptsMade < 3) {
// Retry up to 3 times
job.retry();
} else {
console.error(
`Job ${job.id} moved to dead-letter queue after ${job.attemptsMade} attempts`
);
}
});
app.get("/bot:token/*", async (req, res) => {
const url = req.url
const botTokenEndIndex = url.indexOf("/", 1)
const botToken = url.substring(4, botTokenEndIndex)
const queryParams = req.query;
const data = {
botToken: botToken,
chatId: queryParams.chat_id,
text: queryParams.text,
};
try {
const job = await requestQueue.add(data, {
attempts: 3,
backoff: 5000,
});
res.status(202).send({ jobId: job.id });
} catch (error) {
res.status(500).send({ error: error.message });
}
});
// Endpoint to add a request to the queue
app.post("/sendMessage", async (req, res) => {
try {
const job = await requestQueue.add(req.body, {
attempts: 3,
backoff: 5000,
});
res.status(202).send({ jobId: job.id });
} catch (error) {
res.status(500).send({ error: error.message });
}
});
// Start the server
app.listen(3000, () => {
console.log("Microservice listening on port 3000");
});