Session rest: a rest across the 5 PM roll reports unsynced; health excuses a wake
A firm resting across the trade-date roll kept reporting its last snapshot, so yesterday's realized P&L and DLL lockouts counted as accounts already traded today (Nik's Topstep read 5/5 traded at 5:31 PM from 3:29 PM data). Its report is now the unsynced one until it logs back in; a rest within one trade date reports as before. /api/health also counts a firm logging back in after a rest as nothing wrong, within its 15-minute grace, rather than reading not ok for the seconds before its first sync. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
5eb0ea7760
commit
062ec07f0a
@@ -1,7 +1,7 @@
|
||||
import { readFileSync } from 'node:fs';
|
||||
import path from 'node:path';
|
||||
import { NextResponse } from 'next/server';
|
||||
import { getClients, sessionRestEnabled, sessionRestInfo } from '@/lib/clients';
|
||||
import { getClients, isWaking, sessionRestEnabled, sessionRestInfo } from '@/lib/clients';
|
||||
import { getTradableFirms } from '@/lib/firm-catalog';
|
||||
import { getSchedulerHealth, getSchedulerStatus } from '@/lib/auto-trade';
|
||||
import { getBuildVersion } from '@/lib/version';
|
||||
@@ -41,23 +41,25 @@ export async function GET() {
|
||||
const entries = getTradableFirms().map((firm) => {
|
||||
const base = { firmId: firm.id, firm: firm.name, platform: firm.platform };
|
||||
const client = clients.get(firm.id);
|
||||
if (!client) return { ...base, hasClient: false, ready: false, resting: null, accounts: 0 };
|
||||
if (!client) return { ...base, hasClient: false, ready: false, resting: null, waking: false, accounts: 0 };
|
||||
|
||||
const ready = isClientReady(client, now);
|
||||
const accounts = client.accountList.length;
|
||||
// Logged out on purpose while nothing needs it (lib/clients.ts):
|
||||
// not ready, and nothing wrong.
|
||||
// not ready, and nothing wrong. Nor is logging back in after it,
|
||||
// within its grace — a login that fails stays not ready past that.
|
||||
const resting = sessionRestInfo(firm.id);
|
||||
const waking = isWaking(firm.id, now);
|
||||
try {
|
||||
return { ...base, hasClient: true, ready, resting, accounts, ...client.health() };
|
||||
return { ...base, hasClient: true, ready, resting, waking, accounts, ...client.health() };
|
||||
} catch (err) {
|
||||
// One client's broken health() must not hide the rest.
|
||||
return { ...base, hasClient: true, ready, resting, accounts, healthError: errorMessage(err) };
|
||||
return { ...base, hasClient: true, ready, resting, waking, accounts, healthError: errorMessage(err) };
|
||||
}
|
||||
});
|
||||
|
||||
return NextResponse.json({
|
||||
ok: entries.every((e) => !e.hasClient || e.ready || !!e.resting),
|
||||
ok: entries.every((e) => !e.hasClient || e.ready || !!e.resting || e.waking),
|
||||
sessionRest: sessionRestEnabled(),
|
||||
now,
|
||||
uptimeSec: Math.round(process.uptime()),
|
||||
|
||||
Reference in New Issue
Block a user