Fix: empty markets fallback + rotation fix

This commit is contained in:
2026-03-15 14:40:21 -07:00
parent 677050a224
commit 6921fb1cdd

View File

@@ -2,6 +2,8 @@ import { getActiveBTCEvent, getEventMarkets, getOrderbook, getMarket } from '../
import { KalshiWS } from '../kalshi/websocket.js'; import { KalshiWS } from '../kalshi/websocket.js';
import { EventEmitter } from 'events'; import { EventEmitter } from 'events';
const OPEN_MARKET_STATUSES = new Set(['open', 'active', 'initialized', 'trading']);
/** /**
* Tracks the currently active BTC 15-min market. * Tracks the currently active BTC 15-min market.
* Auto-rotates when the current market expires. * Auto-rotates when the current market expires.
@@ -80,28 +82,41 @@ export class MarketTracker extends EventEmitter {
async _findAndSubscribe() { async _findAndSubscribe() {
try { try {
const event = await getActiveBTCEvent(); const event = await getActiveBTCEvent();
if (!event) { if (!event) {
if (!this.currentTicker) this.emit('update', null);
console.log('[Tracker] No active BTC 15m event found. Retrying in 30s...'); console.log('[Tracker] No active BTC 15m event found. Retrying in 30s...');
return; return;
} }
const markets = event.markets || await getEventMarkets(event.event_ticker); const inlineMarkets = Array.isArray(event.markets) ? event.markets : [];
// Find the up/down market (usually only one market per event) const markets = inlineMarkets.length ? inlineMarkets : await getEventMarkets(event.event_ticker);
const market = markets.find(m => m.status === 'active' || m.status === 'open') || markets[0];
const market = markets.find((m) => OPEN_MARKET_STATUSES.has(String(m?.status || '').toLowerCase())) || markets[0];
if (!market) { if (!market) {
console.log('[Tracker] No active market in event. Retrying...'); if (!this.currentTicker) {
this.currentEvent = event.event_ticker || null;
this.marketData = null;
this.orderbook = { yes: [], no: [] };
this.emit('update', null);
}
console.log(`[Tracker] Event ${event.event_ticker} has no active market yet. Retrying...`);
return; return;
} }
const newTicker = market.ticker; const newTicker = market.ticker;
if (newTicker === this.currentTicker) {
this.currentEvent = event.event_ticker;
return;
}
if (newTicker === this.currentTicker) return; const oldTicker = this.currentTicker;
// Unsubscribe from old // Unsubscribe from old
if (this.currentTicker) { if (oldTicker) {
console.log(`[Tracker] Rotating from ${this.currentTicker}${newTicker}`); console.log(`[Tracker] Rotating from ${oldTicker}${newTicker}`);
this.ws.unsubscribeTicker(this.currentTicker); this.ws.unsubscribeTicker(oldTicker);
} }
this.currentTicker = newTicker; this.currentTicker = newTicker;
@@ -122,8 +137,7 @@ export class MarketTracker extends EventEmitter {
console.log(`[Tracker] Now tracking: ${newTicker} (${market.title || market.subtitle})`); console.log(`[Tracker] Now tracking: ${newTicker} (${market.title || market.subtitle})`);
this.emit('update', this.getState()); this.emit('update', this.getState());
this.emit('market-rotated', { from: this.currentTicker, to: newTicker }); this.emit('market-rotated', { from: oldTicker, to: newTicker });
} catch (err) { } catch (err) {
console.error('[Tracker] Discovery error:', err.message); console.error('[Tracker] Discovery error:', err.message);
} }