Skip to content

Instantly share code, notes, and snippets.

@ming900518
Created September 4, 2023 07:40
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ming900518/77f5e0ba72c65dfbe5bc3f9ec9b63bb5 to your computer and use it in GitHub Desktop.
Save ming900518/77f5e0ba72c65dfbe5bc3f9ec9b63bb5 to your computer and use it in GitHub Desktop.
Express API with queue

Express API with queue

import express, { Application, Request, Response } from "express";

const app: Application = express();

const queue: Array<[number, string]> = new Array();
const result: Array<[number, string | null]> = new Array();

app.post("/:data", (req: Request, res: Response) => {
    const data = req.params.data;
    if (data) {
        const queueNumber = Number(new Date()) + queue.length;
        queue.push([queueNumber, data]);
        return res.status(202).end();
    } else {
        return res.status(400).end();
    }
});

app.get("/fetchResult/:reqNumber", (req: Request, res: Response) => {
    const reqNumber = req.params.reqNumber;
    if (reqNumber) {
        const numberInQueue = queue.find(([queueNumber, _]) => queueNumber === Number(reqNumber));
        const numberInResult = result.find(([queueNumber, _]) => queueNumber === Number(reqNumber));

        if (typeof numberInQueue === "undefined" && typeof numberInResult === "object" && numberInResult![0] !== null) {
            return res.send(JSON.stringify(numberInResult![0]));
        } else if (typeof numberInQueue === "undefined" && typeof numberInResult === "object" && numberInResult![0] === null) {
            return res.status(409).send(JSON.stringify(numberInResult![0]));
        } else if (typeof numberInQueue === "object" && typeof numberInResult === "undefined") {
            return res.status(202).end();
        } else if (typeof numberInQueue === "undefined" && typeof numberInResult === "undefined") {
            return res.status(404).end();
        } else {
            console.error("Getting invalid state when fetching result.");
            return res.status(500).end();
        }
    }
    return res.status(400).end();
});

setInterval(() => process(queue.shift()), 1000);

function process(queueItem: [number, string] | undefined) {
    if (!queueItem) {
        return;
    }
    const [queueNumber, data] = queueItem;
    console.log("Processing ", queueNumber);
    return setTimeout(() => {
        result.push([queueNumber, new Date().toISOString()]);
    }, 2000);
}

app.listen(12345);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment