Files
ai-code-app/etc/servers/work-server/src/services/runtime-drain-service.ts

57 lines
1.4 KiB
TypeScript

type RuntimeDrainState = {
draining: boolean;
drainStartedAt: string | null;
activeHttpRequestCount: number;
activeWebSocketConnectionCount: number;
};
const state: RuntimeDrainState = {
draining: false,
drainStartedAt: null,
activeHttpRequestCount: 0,
activeWebSocketConnectionCount: 0,
};
function clampCount(value: number) {
return Number.isFinite(value) && value > 0 ? Math.trunc(value) : 0;
}
export function beginRuntimeDrain() {
state.draining = true;
state.drainStartedAt = new Date().toISOString();
}
export function endRuntimeDrain() {
state.draining = false;
state.drainStartedAt = null;
}
export function isRuntimeDraining() {
return state.draining;
}
export function trackHttpRequestStarted() {
state.activeHttpRequestCount += 1;
}
export function trackHttpRequestFinished() {
state.activeHttpRequestCount = clampCount(state.activeHttpRequestCount - 1);
}
export function trackWebSocketConnectionOpened() {
state.activeWebSocketConnectionCount += 1;
}
export function trackWebSocketConnectionClosed() {
state.activeWebSocketConnectionCount = clampCount(state.activeWebSocketConnectionCount - 1);
}
export function getRuntimeDrainSnapshot() {
return {
draining: state.draining,
drainStartedAt: state.drainStartedAt,
activeHttpRequestCount: state.activeHttpRequestCount,
activeWebSocketConnectionCount: state.activeWebSocketConnectionCount,
};
}