39 lines
1.3 KiB
TypeScript
39 lines
1.3 KiB
TypeScript
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(', ')}`,
|
|
);
|
|
}
|
|
}
|