feat(kafka): add message display ordering
This commit is contained in:
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);
|
||||
}
|
||||
Reference in new issue
Block a user