import { createHmac, timingSafeEqual } from "node:crypto";
import express from "express";
function verifyInboxbase(sigHeader, body, secret) {
const parts = Object.fromEntries(
sigHeader.split(",").map((p) => p.split("=")),
);
if (Math.abs(Date.now() / 1000 - Number(parts.t)) > 300) return false;
const expected = createHmac("sha256", secret)
.update(`${parts.t}.${body}`)
.digest("hex");
return timingSafeEqual(
Buffer.from(expected, "hex"),
Buffer.from(parts.v1, "hex"),
);
}
const app = express();
app.post(
"/12m",
express.raw({ type: "application/json" }),
(req, res) => {
const ok = verifyInboxbase(
req.header("X-Inboxbase-Signature"),
req.body,
process.env.WHSEC,
);
if (!ok) return res.status(401).end();
const event = JSON.parse(req.body.toString());
// handle event.type ...
res.status(200).end();
},
);