57 lines
1.4 KiB
TypeScript
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,
|
|
};
|
|
}
|