mirror of
https://github.com/tdurieux/anonymous_github.git
synced 2026-10-19 14:17:20 +02:00
* perf: bound request work and resource usage * fix: address performance review regressions * fix: guard content expiration and dashboard state * fix: tolerate cache outages and retire derived paths * fix: revalidate expiration claims and status pagination * fix: retry interrupted repository metadata cleanup * fix: retire obsolete content cache storage * fix: activate tree metadata and recheck expiration claims * fix: fence cache publication across expiration * fix: recover staged trees and enforce cache lifecycle cleanup * fix: prune expired transforms during database outages * fix: finish conference removals and reload expiration candidates
25 lines
1020 B
TypeScript
25 lines
1020 B
TypeScript
import { Readable, Writable } from "stream";
|
|
|
|
/** Cancel upstream on every response terminal event, including a pre-header close. */
|
|
export function streamResponse(source: Readable, response: Writable,
|
|
onError: (error: Error) => void): Promise<void> {
|
|
return new Promise((resolve, reject) => {
|
|
const cleanup = () => {
|
|
response.removeListener("close", done);
|
|
response.removeListener("finish", done);
|
|
response.removeListener("error", failed);
|
|
source.removeListener("error", upstreamFailed);
|
|
source.unpipe(response);
|
|
source.destroy();
|
|
};
|
|
const done = () => { cleanup(); resolve(); };
|
|
const failed = (error: Error) => { cleanup(); reject(error); };
|
|
const upstreamFailed = (error: Error) => { onError(error); done(); };
|
|
response.once("close", done);
|
|
response.once("finish", done);
|
|
response.once("error", failed);
|
|
source.once("error", upstreamFailed);
|
|
if (response.destroyed || response.writableEnded) done(); else source.pipe(response);
|
|
});
|
|
}
|