diff --git a/src/server.ts b/src/server.ts index a0abf33..c3b33c6 100644 --- a/src/server.ts +++ b/src/server.ts @@ -348,6 +348,16 @@ Bun.serve({ let freigeben: () => void; try { freigeben = await belegen(ziel.upstreamName, ziel.upstream); + // Der Slot haengt am LEBEN DER VERBINDUNG, nicht am Ende des Streams. + // Gegenprobe am 2026-09-07: cancel() im TransformStream feuert in Bun + // NICHT, wenn der Client abbricht -- der Slot blieb belegt, und erst die + // 30-s-Frist machte daraus ein 503 statt Stille (42i/intern#1283). + // req.signal feuert dagegen zuverlaessig; die Freigabe ist gegen + // Doppelaufruf gesichert, ein spaeteres flush() schadet also nicht. + // Dazu ein Sicherheitsnetz: laenger als der Upstream-Timeout darf kein + // Slot gehalten werden, egal was passiert. + req.signal.addEventListener("abort", () => freigeben(), { once: true }); + setTimeout(() => freigeben(), 660_000); } catch (e) { if (e instanceof SlotFrist) { eintrag.status = 503; eintrag.fehler = e.message; abschliessen();