From 4528c836d6af103c128a0a50e065317ad8328a57 Mon Sep 17 00:00:00 2001 From: ReplayX Bot Date: Mon, 20 Apr 2026 01:06:44 +0530 Subject: [PATCH] fix(checkout-api): resolve checkout-race-condition --- demo_app/src/checkout/submit-order.ts | 14 +++++++++++++- demo_app/src/inventory/reserve-stock.ts | 9 +++++++-- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/demo_app/src/checkout/submit-order.ts b/demo_app/src/checkout/submit-order.ts index dd6d47f..af2fdb7 100644 --- a/demo_app/src/checkout/submit-order.ts +++ b/demo_app/src/checkout/submit-order.ts @@ -14,5 +14,17 @@ export const runCheckoutRaceScenario = async (mode: "concurrent" | "serial"): Pr return [await processCheckoutWorker(requests[0])]; } - return Promise.all(requests.map((request) => processCheckoutWorker(request))); + const settled = await Promise.allSettled(requests.map((request) => processCheckoutWorker(request))); + + const hardFailure = settled.find( + (result) => + result.status === "rejected" && + !(result.reason instanceof Error && result.reason.message.startsWith("OutOfStock:")) + ); + + if (hardFailure && hardFailure.status === "rejected") { + throw hardFailure.reason; + } + + return settled.flatMap((result) => (result.status === "fulfilled" ? [result.value] : [])); }; diff --git a/demo_app/src/inventory/reserve-stock.ts b/demo_app/src/inventory/reserve-stock.ts index 08276cd..d925657 100644 --- a/demo_app/src/inventory/reserve-stock.ts +++ b/demo_app/src/inventory/reserve-stock.ts @@ -19,6 +19,11 @@ export const reserveStock = async (sku: string, quantity: number, requestId: str await delay(25); const record = getInventoryRecord(sku); + + if (record.available < quantity) { + throw new Error(`OutOfStock: ${sku}`); + } + record.available -= quantity; record.snapshotVersion += 1; @@ -29,8 +34,8 @@ export const reserveStock = async (sku: string, quantity: number, requestId: str } return { - reservationToken: `res_${requestId}_${snapshot.snapshotVersion}`, - snapshotVersion: snapshot.snapshotVersion, + reservationToken: `res_${requestId}_${record.snapshotVersion}`, + snapshotVersion: record.snapshotVersion, availableAfter: record.available }; };