unrip/src/core/executor-command-expiry.mjs
philipp 92aa636dc0
Some checks failed
deploy / deploy (push) Failing after 52s
Restore live trading under quote pressure
Proof: npm test (209/209) covers stale command expiry, bounded executor state, bounded strategy quote cache, bounded quote outcome refresh, and resource guardrails.

Assumptions: current DB pair config and armed state remain the operator-approved live trading controls; stale quote commands are unsafe to submit after their min_deadline_ms.

Still fake: quote outcomes still infer fills from inventory deltas rather than a venue-native terminal fill event.
2026-05-18 12:51:25 +02:00

54 lines
1.5 KiB
JavaScript

const DEFAULT_COMMAND_DEADLINE_MS = 60_000;
export function classifyExecuteCommandExpiry(event, { now = Date.now() } = {}) {
const payload = event?.payload || {};
const observedAtMs = parseTimestamp(
event?.observed_at
|| payload.quote_observed_at
|| payload.decision_at
|| event?.ingested_at,
);
const deadlineMs = parseDeadlineMs(payload.min_deadline_ms);
if (!Number.isFinite(observedAtMs)) {
return {
expired: true,
reason: 'command_timestamp_missing',
age_ms: null,
deadline_ms: deadlineMs,
deadline_at: null,
};
}
if (!Number.isFinite(deadlineMs) || deadlineMs <= 0) {
return {
expired: true,
reason: 'command_deadline_invalid',
age_ms: Math.max(0, now - observedAtMs),
deadline_ms: null,
deadline_at: null,
};
}
const deadlineAtMs = observedAtMs + deadlineMs;
const ageMs = Math.max(0, now - observedAtMs);
return {
expired: now > deadlineAtMs,
reason: now > deadlineAtMs ? 'command_deadline_elapsed' : null,
age_ms: ageMs,
deadline_ms: deadlineMs,
deadline_at: new Date(deadlineAtMs).toISOString(),
};
}
function parseDeadlineMs(value) {
if (value == null || value === '') return DEFAULT_COMMAND_DEADLINE_MS;
const parsed = Number(value);
return Number.isFinite(parsed) ? parsed : Number.NaN;
}
function parseTimestamp(value) {
if (!value) return Number.NaN;
const parsed = Date.parse(value);
return Number.isFinite(parsed) ? parsed : Number.NaN;
}