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:
@@ -109,15 +109,26 @@ function buildChatEventDedupeKey(eventState: string, event: Record<string, unkno
|
|||||||
return null;
|
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 {
|
function isDuplicateChatEvent(eventState: string, event: Record<string, unknown>): boolean {
|
||||||
const key = buildChatEventDedupeKey(eventState, event);
|
const key = buildChatEventDedupeKey(eventState, event);
|
||||||
if (!key) return false;
|
const msgKey = getFinalMessageIdDedupeKey(eventState, event);
|
||||||
|
if (!key && !msgKey) return false;
|
||||||
const now = Date.now();
|
const now = Date.now();
|
||||||
pruneChatEventDedupe(now);
|
pruneChatEventDedupe(now);
|
||||||
if (_chatEventDedupe.has(key)) {
|
if ((key && _chatEventDedupe.has(key)) || (msgKey && _chatEventDedupe.has(msgKey))) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
_chatEventDedupe.set(key, now);
|
if (key) _chatEventDedupe.set(key, now);
|
||||||
|
if (msgKey) _chatEventDedupe.set(msgKey, now);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -67,15 +67,28 @@ function buildGatewayEventDedupeKey(event: Record<string, unknown>): string | nu
|
|||||||
return null;
|
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 {
|
function shouldProcessGatewayEvent(event: Record<string, unknown>): boolean {
|
||||||
const key = buildGatewayEventDedupeKey(event);
|
const key = buildGatewayEventDedupeKey(event);
|
||||||
if (!key) return true;
|
const msgKey = getMessageIdDedupeKey(event);
|
||||||
|
if (!key && !msgKey) return true;
|
||||||
const now = Date.now();
|
const now = Date.now();
|
||||||
pruneGatewayEventDedupe(now);
|
pruneGatewayEventDedupe(now);
|
||||||
if (gatewayEventDedupe.has(key)) {
|
if ((key && gatewayEventDedupe.has(key)) || (msgKey && gatewayEventDedupe.has(msgKey))) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
gatewayEventDedupe.set(key, now);
|
if (key) gatewayEventDedupe.set(key, now);
|
||||||
|
if (msgKey) gatewayEventDedupe.set(msgKey, now);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user