fix(web): infinite recursion in TimelineView getEventTime
Some checks are pending
CI / test (18.x) (push) Waiting to run
CI / test (20.x) (push) Waiting to run
CI / test (22.x) (push) Waiting to run

The getEventTime function had a bug where it recursively called itself
when event.timestamp was truthy, causing "Maximum call stack size exceeded".

Fixed by using Date.parse() to convert the ISO timestamp string to unix ms.

All 26 failing TimelineView tests now pass.

Closes: bf-50m5
This commit is contained in:
jedarden 2026-05-26 21:29:45 -04:00
parent 7df43a353b
commit 10533b0b4f

View file

@ -42,6 +42,11 @@ interface TimelineSegment {
intensity: number; // 0-1 for block visualization
}
// Events arrive with ts (unix ms) from the server; timestamp (ISO string) is the
// frontend-normalised field. Accept either so the timeline works with both.
const getEventTime = (event: LogEvent): number =>
event.ts ?? (event.timestamp ? Date.parse(event.timestamp) : 0);
const TIME_RANGE_MS: Record<TimeRange, number> = {
'5m': 5 * 60 * 1000,
'10m': 10 * 60 * 1000,
@ -232,7 +237,7 @@ const TimelineView: React.FC<TimelineViewProps> = ({
filteredEvents
.filter(e => new Date(e.timestamp).getTime() >= rangeStart)
.forEach(event => {
const eventTime = new Date(event.timestamp).getTime();
const eventTime = getEventTime(event);
const bucketStart = Math.floor(eventTime / BUCKET_SIZE) * BUCKET_SIZE;
if (!workerBuckets.has(event.worker)) {
@ -420,7 +425,7 @@ const TimelineView: React.FC<TimelineViewProps> = ({
// Find events in this time range for this worker
const blockEvents = filteredEvents.filter(event => {
const eventTime = new Date(event.timestamp).getTime();
const eventTime = getEventTime(event);
return event.worker === workerId && eventTime >= blockStart && eventTime < blockEnd;
});
@ -530,7 +535,7 @@ const TimelineView: React.FC<TimelineViewProps> = ({
// Find events in this time range for this worker
const blockEvents = filteredEvents.filter(event => {
const eventTime = new Date(event.timestamp).getTime();
const eventTime = getEventTime(event);
return event.worker === workerData.workerId && eventTime >= blockStart && eventTime < blockEnd;
});
@ -661,7 +666,7 @@ const TimelineView: React.FC<TimelineViewProps> = ({
className={`popup-event-item popup-event-${event.level}`}
onClick={() => {
if (onTimeSelect) {
onTimeSelect(new Date(event.timestamp).getTime());
onTimeSelect(getEventTime(event));
}
setBlockEventPopup(null);
}}