Files
NODEDC_MISSION_CORE/plugins/xgrids-k1/frontend/src/controlSessionCas.ts
T
DCCONSTRUCTIONS 0ca7316a24 wip(k1): checkpoint connection recovery rewrite
Capture the current unreleased K1 connection, recovery, lifecycle, viewer, and test work as a single known-bad baseline for subsequent fixes.
2026-08-14 14:57:50 +03:00

73 lines
2.4 KiB
TypeScript

import { ApiError, type XgridsK1State } from "./api";
export interface ExactApplicationControlCas {
expected_session_generation: number;
expected_state_revision: number;
}
export interface ExactAcquisitionControlCas {
expected_control_session_generation: number;
expected_control_state_revision: number;
}
interface ControlSessionVersion {
sessionGeneration: number;
stateRevision: number;
}
function exactControlSessionVersion(
state: XgridsK1State | null | undefined,
actionLabel: string,
): ControlSessionVersion {
const session = state?.application_control_session;
const sessionGeneration = session?.session_generation;
const stateRevision = session?.state_revision;
if (
!Number.isSafeInteger(sessionGeneration)
|| (sessionGeneration ?? -1) < 0
|| !Number.isSafeInteger(stateRevision)
|| (stateRevision ?? -1) < 0
) {
throw new ApiError(
`Команда ${actionLabel} не отправлена: последнее принятое состояние не содержит целые session_generation и state_revision управляющей сессии. Обновите состояние K1 и повторите отдельным действием.`,
);
}
return {
sessionGeneration: sessionGeneration as number,
stateRevision: stateRevision as number,
};
}
export function exactApplicationControlCas(
latestAcceptedState: XgridsK1State | null | undefined,
actionLabel: string,
): ExactApplicationControlCas {
const version = exactControlSessionVersion(latestAcceptedState, actionLabel);
return {
expected_session_generation: version.sessionGeneration,
expected_state_revision: version.stateRevision,
};
}
export function exactAcquisitionControlCas(
latestAcceptedState: XgridsK1State | null | undefined,
actionLabel: string,
): ExactAcquisitionControlCas {
const version = exactControlSessionVersion(latestAcceptedState, actionLabel);
return {
expected_control_session_generation: version.sessionGeneration,
expected_control_state_revision: version.stateRevision,
};
}
export function acquisitionMutationUsesControlSession(
latestAcceptedState: XgridsK1State | null | undefined,
): boolean {
const session = latestAcceptedState?.application_control_session;
return Boolean(
session
&& session.mode === "interactive-canonical"
&& !["idle", "closed", "completed"].includes(session.state),
);
}