Enhance deduplication logic for chat and gateway events by introducing a new method to generate deduplication keys based on final message IDs. This improves the handling of duplicate events in both chat and gateway stores.

This commit is contained in:
Haze
2026-04-13 17:29:19 +08:00
parent 9a84da4f8e
commit cf43237c67
2 changed files with 30 additions and 6 deletions

View File

@@ -109,15 +109,26 @@ function buildChatEventDedupeKey(eventState: string, event: Record<string, unkno
return null;
}
function getFinalMessageIdDedupeKey(eventState: string, event: Record<string, unknown>): string | null {
if (eventState !== 'final') return null;
const msg = (event.message && typeof event.message === 'object')
? event.message as Record<string, unknown>
: null;
if (msg?.id != null) return `final-msgid|${String(msg.id)}`;
return null;
}
function isDuplicateChatEvent(eventState: string, event: Record<string, unknown>): boolean {
const key = buildChatEventDedupeKey(eventState, event);
if (!key) return false;
const msgKey = getFinalMessageIdDedupeKey(eventState, event);
if (!key && !msgKey) return false;
const now = Date.now();
pruneChatEventDedupe(now);
if (_chatEventDedupe.has(key)) {
if ((key && _chatEventDedupe.has(key)) || (msgKey && _chatEventDedupe.has(msgKey))) {
return true;
}
_chatEventDedupe.set(key, now);
if (key) _chatEventDedupe.set(key, now);
if (msgKey) _chatEventDedupe.set(msgKey, now);
return false;
}

View File

@@ -67,15 +67,28 @@ function buildGatewayEventDedupeKey(event: Record<string, unknown>): string | nu
return null;
}
function getMessageIdDedupeKey(event: Record<string, unknown>): string | null {
const state = event.state != null ? String(event.state) : '';
if (state !== 'final') return null;
const message = event.message;
if (message && typeof message === 'object') {
const msgId = (message as Record<string, unknown>).id;
if (msgId != null) return `final-msgid|${String(msgId)}`;
}
return null;
}
function shouldProcessGatewayEvent(event: Record<string, unknown>): boolean {
const key = buildGatewayEventDedupeKey(event);
if (!key) return true;
const msgKey = getMessageIdDedupeKey(event);
if (!key && !msgKey) return true;
const now = Date.now();
pruneGatewayEventDedupe(now);
if (gatewayEventDedupe.has(key)) {
if ((key && gatewayEventDedupe.has(key)) || (msgKey && gatewayEventDedupe.has(msgKey))) {
return false;
}
gatewayEventDedupe.set(key, now);
if (key) gatewayEventDedupe.set(key, now);
if (msgKey) gatewayEventDedupe.set(msgKey, now);
return true;
}