fix: normalize workbench trace event page cursors
This commit is contained in:
@@ -730,7 +730,7 @@ function turnSnapshot({ projection, result, session, trace }) {
|
||||
|
||||
function traceEventPage(snapshot, options) {
|
||||
const sourceEvents = Array.isArray(snapshot?.events) ? snapshot.events : [];
|
||||
const indexed = sourceEvents.map((event, index) => ({ event, seq: eventSeq(event, index) }));
|
||||
const indexed = normalizedTracePageEvents(sourceEvents);
|
||||
const startIndex = indexed.findIndex((item) => item.seq > options.afterSeq);
|
||||
const offset = startIndex >= 0 ? startIndex : indexed.length;
|
||||
const page = indexed.slice(offset, offset + options.limit);
|
||||
@@ -756,6 +756,39 @@ function traceEventPage(snapshot, options) {
|
||||
};
|
||||
}
|
||||
|
||||
function normalizedTracePageEvents(sourceEvents) {
|
||||
return sourceEvents
|
||||
.map((event, index) => ({
|
||||
event,
|
||||
sourceIndex: index,
|
||||
persistedSeq: eventSeq(event, index),
|
||||
sourceSeq: positiveTraceInteger(event?.sourceSeq),
|
||||
createdAtMs: traceEventTimestampMs(event)
|
||||
}))
|
||||
.sort(compareTracePageEvents)
|
||||
.map((item, index) => ({ event: item.event, seq: index + 1 }));
|
||||
}
|
||||
|
||||
function compareTracePageEvents(left, right) {
|
||||
if (left.createdAtMs !== right.createdAtMs) return left.createdAtMs - right.createdAtMs;
|
||||
if (left.sourceSeq !== right.sourceSeq) return left.sourceSeq - right.sourceSeq;
|
||||
if (left.persistedSeq !== right.persistedSeq) return left.persistedSeq - right.persistedSeq;
|
||||
return left.sourceIndex - right.sourceIndex;
|
||||
}
|
||||
|
||||
function traceEventTimestampMs(event) {
|
||||
for (const value of [event?.createdAt, event?.occurredAt, event?.timestamp, event?.appendedAt]) {
|
||||
const parsed = Date.parse(String(value ?? ""));
|
||||
if (Number.isFinite(parsed)) return parsed;
|
||||
}
|
||||
return Number.MAX_SAFE_INTEGER;
|
||||
}
|
||||
|
||||
function positiveTraceInteger(value) {
|
||||
const parsed = Number(value);
|
||||
return Number.isFinite(parsed) && parsed > 0 ? Math.trunc(parsed) : Number.MAX_SAFE_INTEGER;
|
||||
}
|
||||
|
||||
function tracePageOptions(url) {
|
||||
const cursor = textValue(url.searchParams.get("cursor"));
|
||||
const cursorSeq = cursor.startsWith("seq:") ? Number.parseInt(cursor.slice(4), 10) : NaN;
|
||||
|
||||
Reference in New Issue
Block a user