fix(pi): harden release proof lifecycle

This commit is contained in:
2026-08-24 17:59:49 +08:00
parent ead9d1dbaf
commit 09841c8dbd
7 changed files with 286 additions and 36 deletions

View File

@@ -0,0 +1,38 @@
export type PiReleasePressureCleanupStep = {
name: string;
run(): void | Promise<void>;
};
export async function runPiReleasePressureCleanup(
steps: readonly PiReleasePressureCleanupStep[],
options: { stepTimeoutMs?: number } = {},
): Promise<void> {
const stepTimeoutMs = options.stepTimeoutMs ?? 10_000;
if (!Number.isSafeInteger(stepTimeoutMs) || stepTimeoutMs <= 0) {
throw new Error('PI release pressure cleanup timeout must be a positive safe integer');
}
const failures: Array<{ name: string; error: unknown }> = [];
for (const step of steps) {
let timeout: ReturnType<typeof setTimeout> | undefined;
try {
await Promise.race([
Promise.resolve().then(() => step.run()),
new Promise<never>((_resolve, reject) => {
timeout = setTimeout(() => {
reject(new Error(`PI release pressure cleanup timed out: ${step.name}`));
}, stepTimeoutMs);
}),
]);
} catch (error) {
failures.push({ name: step.name, error });
} finally {
if (timeout) clearTimeout(timeout);
}
}
if (failures.length > 0) {
throw new AggregateError(
failures.map(({ error }) => error),
`PI release pressure cleanup failed: ${failures.map(({ name }) => name).join(', ')}`,
);
}
}