Läser register…
Avdelning 04
När något ändras i spärregistret kan ni få det levererat i stället för att fråga om och om igen. Varje händelse är signerad, har ett eget id och görs om tills ni kvitterar den.
Följden nedan gäller en enskild händelse. Tidsavstånden bestäms av backoff-strategin, inte av ett fast schema.
X-MarketMute-Signature.Jämför alltid signaturer i konstant tid, och gör jämförelsen på den råa kroppen — inte på ett objekt som redan passerat en JSON-parser. En omserialisering ändrar bytes och gör signaturen ogiltig.
import { createHmac, timingSafeEqual } from "node:crypto";
export function verify(rawBody: Buffer, header: string, secret: string) {
const expected = createHmac("sha256", secret).update(rawBody).digest();
const received = Buffer.from(header, "hex");
// Olika längd => aldrig giltig, och timingSafeEqual kastar.
if (expected.length !== received.length) return false;
return timingSafeEqual(expected, received);
}
Eftersom leveransen görs om vid uteblivet kvitto kommer samma händelse att kunna nå er mer än en gång — till exempel när ert svar försvann på vägen tillbaka. Lagra händelsens id och behandla en upprepning som en icke-händelse.
// Kvitterar direkt om händelsen redan är behandlad.
if (await seen(event.id)) {
return response(204);
}
await apply(event);
await remember(event.id);
return response(204);
| Ert svar | Tolkning | Följd |
|---|---|---|
| 200 | Kvitterat. | Leveransen är klar. |
| 204 | Kvitterat utan innehåll. | Leveransen är klar. |
| 4xx | Misslyckat försök. | Nytt försök enligt backoff, upp till fem. |
| 5xx | Misslyckat försök. | Nytt försök enligt backoff, upp till fem. |