feat(kafka): add message display ordering

This commit is contained in:
Guoyu Su authored and GitHub committed 2026-08-31 23:47:51 +08:00
1 parent 42c0dc7f89
commit 2fe26052a7
12 files changed
+171 -26

No files matched your search

@@ -0,0 +1,32 @@
import { describe, expect, it } from "vitest";
import type { PeekedMessage } from "@/types/mq";
import { sortKafkaMessagesByPublishTime } from "@/lib/mq/kafkaMessageSort";
function message(position: number, publishTime?: string): PeekedMessage {
return {
position,
messageId: String(position),
publishTime,
payloadBase64: "",
payloadText: `message ${position}`,
properties: {},
headers: {},
};
}
describe("Kafka message display sorting", () => {
it("sorts valid timestamps in either direction without mutating the input", () => {
const messages = [message(1, "1000"), message(2, "3000"), message(3, "2000")];
expect(sortKafkaMessagesByPublishTime(messages, "newest").map(({ position }) => position)).toEqual([2, 3, 1]);
expect(sortKafkaMessagesByPublishTime(messages, "oldest").map(({ position }) => position)).toEqual([1, 3, 2]);
expect(messages.map(({ position }) => position)).toEqual([1, 2, 3]);
});
it("keeps equal and unavailable timestamps stable after valid timestamps", () => {
const messages = [message(1), message(2, "2000"), message(3, "invalid"), message(4, "2000"), message(5, "")];
expect(sortKafkaMessagesByPublishTime(messages, "newest").map(({ position }) => position)).toEqual([2, 4, 1, 3, 5]);
expect(sortKafkaMessagesByPublishTime(messages, "oldest").map(({ position }) => position)).toEqual([2, 4, 1, 3, 5]);
});
});
@@ -0,0 +1,23 @@
import type { PeekedMessage } from "@/types/mq";
export type KafkaMessageDisplayOrder = "newest" | "oldest";
function parsePublishTime(value?: string): number | null {
if (value == null || value.trim() === "") return null;
const timestamp = Number(value);
return Number.isFinite(timestamp) ? timestamp : null;
}
export function sortKafkaMessagesByPublishTime(messages: readonly PeekedMessage[], order: KafkaMessageDisplayOrder): PeekedMessage[] {
return messages
.map((message, index) => ({ message, index, timestamp: parsePublishTime(message.publishTime) }))
.sort((left, right) => {
if (left.timestamp == null && right.timestamp != null) return 1;
if (left.timestamp != null && right.timestamp == null) return -1;
if (left.timestamp != null && right.timestamp != null && left.timestamp !== right.timestamp) {
return order === "newest" ? right.timestamp - left.timestamp : left.timestamp - right.timestamp;
}
return left.index - right.index;
})
.map(({ message }) => message);
}