Skip to content

Instantly share code, notes, and snippets.

@shidhincr
Last active December 6, 2023 15:42
Show Gist options
  • Save shidhincr/66ab5803bd9c7ac9943b52c2eb442eaa to your computer and use it in GitHub Desktop.
Save shidhincr/66ab5803bd9c7ac9943b52c2eb442eaa to your computer and use it in GitHub Desktop.
Queue endpoint
const express = require("express");
const app = express();
const queue = require("./queue");
app.get("/stats", (req, res) => {
res.send(JSON.stringify(queue.dump()));
});
app.get("/enqueue", (req, res) => {
const message = req.query.message;
queue.enqueue(message);
res.send("message queued = " + message);
});
app.get("/dequeue", (req, res) => {
const m = queue.dequeue();
if (m) {
res.send("message is = " + m.message);
} else {
res.send("no message in queue");
}
});
app.listen(3000, () => {
console.log("Server is running on port 3000");
});
const queue = [];
const deadQueue = [];
const processMap = {};
const RETRY_TIMEOUT = 3000; // in ms
let id = 1;
module.exports = {
enqueue(message) {
if (typeof message == "string") {
message = { message, id: id++ };
}
processMap[message.id] = (processMap[message.id] || 0) + 1;
if (processMap[message.id] > 3) {
deadQueue.push(message);
return;
}
queue.push(message);
},
dequeue() {
const m = queue.shift();
if (m) {
this.process(m);
return m;
}
return null;
},
process(m) {
setTimeout(this.enqueue.bind(this, m), RETRY_TIMEOUT);
},
dump() {
return {
queue,
deadQueue,
};
},
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment