openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
33 lines (32 loc) • 1.52 kB
JavaScript
import { i as resolveGlobalSingleton } from "./global-singleton-Dc_stLtU.js";
//#region src/gateway/server-media-cleanup-lifecycle.ts
const MEDIA_CLEANUP_STOP_TIMEOUT_MS = 5e3;
const mediaCleanupDrains = resolveGlobalSingleton(Symbol.for("openclaw.gateway.mediaCleanupDrains"), () => /* @__PURE__ */ new Set());
/** Tracks cleanup work until settlement so later gateway generations retain shared state. */
function registerMediaCleanupDrain(drain) {
mediaCleanupDrains.add(drain);
drain.finally(() => mediaCleanupDrains.delete(drain));
}
/** Defers a replacement cleanup owner until every prior gateway generation settles. */
async function waitForMediaCleanupDrainsToSettle() {
while (mediaCleanupDrains.size > 0) await Promise.allSettled(mediaCleanupDrains);
}
/** Waits for every process-owned cleanup generation, bounded for restart availability. */
async function waitForMediaCleanupDrains(params) {
const drains = [...mediaCleanupDrains];
if (drains.length === 0) return "drained";
let timeout;
const timedOut = new Promise((resolve) => {
timeout = setTimeout(() => resolve(true), params.timeoutMs);
timeout.unref?.();
});
const result = await Promise.race([Promise.allSettled(drains).then(() => false), timedOut]);
if (timeout) clearTimeout(timeout);
if (result) {
params.onTimeout?.();
return "timed-out";
}
return "drained";
}
//#endregion
export { waitForMediaCleanupDrainsToSettle as i, registerMediaCleanupDrain as n, waitForMediaCleanupDrains as r, MEDIA_CLEANUP_STOP_TIMEOUT_MS as t };