fix: normalize workbench trace event page cursors

This commit is contained in:
lyon
2026-06-19 14:59:58 +08:00
parent db518feac3
commit d4ead4d0f1
3 changed files with 111 additions and 1 deletions
+34 -1
View File
@@ -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;