Some checks failed
deploy / deploy (push) Failing after 52s
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.
54 lines
1.5 KiB
JavaScript
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;
|
|
}
|