fix(telegram): persist only new sent-message cache entries

This commit is contained in:
Ayaan Zaidi
2026-07-01 14:38:59 -07:00
parent d9b5afad18
commit abaef63a35
2 changed files with 38 additions and 23 deletions

View File

@@ -368,7 +368,24 @@ describe("sent-message-cache", () => {
expect(wasSentByBot(123, 1)).toBe(true);
});
it("persists sent-message rows with their remaining logical ttl", () => {
it("persists only the newly recorded sent-message row", () => {
const persistedMessageIds: string[] = [];
setTelegramSentMessageStoreForTest({
...sentMessageStore,
register(key, value, options) {
sentMessageStore.register(key, value, options);
persistedMessageIds.push(value.messageId);
},
});
recordSentMessage(123, 1);
recordSentMessage(123, 2);
recordSentMessage(456, 10);
expect(persistedMessageIds).toEqual(["1", "2", "10"]);
});
it("persists sent-message rows with a per-entry ttl", () => {
vi.useFakeTimers();
vi.setSystemTime(new Date("2026-01-26T12:00:00.000Z"));
const ttlByMessageId = new Map<string, number>();
@@ -384,7 +401,7 @@ describe("sent-message-cache", () => {
vi.advanceTimersByTime(60 * 60 * 1000);
recordSentMessage(123, 2);
expect(ttlByMessageId.get("1")).toBe(23 * 60 * 60 * 1000);
expect(ttlByMessageId.get("1")).toBe(24 * 60 * 60 * 1000);
expect(ttlByMessageId.get("2")).toBe(24 * 60 * 60 * 1000);
});

View File

@@ -105,6 +105,12 @@ function cleanupExpired(
}
}
function cleanupExpiredSentMessages(store: SentMessageStore, now: number): void {
for (const [scopeKey, entry] of store) {
cleanupExpired(store, scopeKey, entry, now);
}
}
function readLegacySentMessages(filePath: string): SentMessageStore {
try {
const raw = fs.readFileSync(filePath, "utf-8");
@@ -173,23 +179,17 @@ function getSentMessages(cfg?: Pick<OpenClawConfig, "session">): SentMessageStor
return getSentMessageBucket(cfg).store;
}
function persistSentMessages(bucket: SentMessageBucket): void {
const { store, scopeKey } = bucket;
const now = Date.now();
for (const [chatId, entry] of store) {
cleanupExpired(store, chatId, entry, now);
for (const [messageId, timestamp] of entry) {
const ttlMs = TTL_MS - Math.max(0, now - timestamp);
if (ttlMs <= 0) {
continue;
}
openSentMessageStore().register(
sentMessageEntryKey(scopeKey, chatId, messageId),
{ scopeKey, chatId, messageId, timestamp },
{ ttlMs },
);
}
}
function persistSentMessage(
bucket: SentMessageBucket,
chatId: string,
messageId: string,
timestamp: number,
): void {
openSentMessageStore().register(
sentMessageEntryKey(bucket.scopeKey, chatId, messageId),
{ scopeKey: bucket.scopeKey, chatId, messageId, timestamp },
{ ttlMs: TTL_MS },
);
}
export function recordSentMessage(
@@ -208,11 +208,9 @@ export function recordSentMessage(
store.set(scopeKey, entry);
}
entry.set(idKey, now);
if (entry.size > 100) {
cleanupExpired(store, scopeKey, entry, now);
}
cleanupExpiredSentMessages(store, now);
try {
persistSentMessages(bucket);
persistSentMessage(bucket, scopeKey, idKey, now);
} catch (error) {
logVerbose(`telegram: failed to persist sent-message cache: ${String(error)}`);
}