Merge pull request #1947 from PR0M3TH3AN/codex/locate-dm-state-management-in-cache

Merge paged DM results into stable cache keyed by event id
This commit is contained in:
thePR0M3TH3AN authored and GitHub committed 2026-01-29 15:33:14 -05:00
commit 83efdfcec7
1 file changed
+60 -23
+60 -23
View File
@@ -480,6 +480,61 @@ function buildSnapshotFromMessages(messages, actorPubkey = "", resolvePreview =
);
}
function normalizeDirectMessagePayload(message) {
if (!message || message.ok !== true) {
return null;
}
const eventId = typeof message?.event?.id === "string" ? message.event.id : "";
if (!eventId) {
return null;
}
const timestamp =
Number.isFinite(message?.timestamp)
? message.timestamp
: Number.isFinite(message?.message?.created_at)
? message.message.created_at
: Number.isFinite(message?.event?.created_at)
? message.event.created_at
: Date.now() / 1000;
return {
...message,
timestamp,
};
}
function mergeDirectMessageCache(existingMessages, incomingMessages) {
const mergedIndex = new Map();
const upsert = (message) => {
const normalized = normalizeDirectMessagePayload(message);
if (!normalized) {
return;
}
const eventId = normalized.event.id;
const existing = mergedIndex.get(eventId);
if (!existing || normalized.timestamp >= (existing.timestamp || 0)) {
mergedIndex.set(eventId, normalized);
}
};
for (const message of Array.isArray(existingMessages) ? existingMessages : []) {
upsert(message);
}
for (const message of Array.isArray(incomingMessages) ? incomingMessages : []) {
upsert(message);
}
const mergedMessages = Array.from(mergedIndex.values());
mergedMessages.sort((a, b) => (b?.timestamp || 0) - (a?.timestamp || 0));
return { messages: mergedMessages, index: mergedIndex };
}
function hydrateMessagesFromSnapshot(snapshot, actorPubkey = "") {
const normalizedActor = normalizeHexPubkey(actorPubkey);
const hydrated = [];
@@ -968,37 +1023,19 @@ export class NostrService {
}
const collected = [];
const index = new Map();
for (const message of Array.isArray(messages) ? messages : []) {
if (!message || message.ok !== true) {
const normalized = normalizeDirectMessagePayload(message);
if (!normalized) {
continue;
}
const eventId = message?.event?.id;
if (typeof eventId !== "string" || !eventId) {
continue;
}
const normalized = {
...message,
timestamp:
Number.isFinite(message?.timestamp)
? message.timestamp
: Number.isFinite(message?.message?.created_at)
? message.message.created_at
: Number.isFinite(message?.event?.created_at)
? message.event.created_at
: Date.now() / 1000,
};
index.set(eventId, normalized);
collected.push(normalized);
}
collected.sort((a, b) => (b?.timestamp || 0) - (a?.timestamp || 0));
this.dmMessageIndex = index;
this.dmMessages = collected;
const merged = mergeDirectMessageCache(this.dmMessages, collected);
this.dmMessageIndex = merged.index;
this.dmMessages = merged.messages;
const snapshot = this.getDirectMessages();