Fix message loss when processMessage throws

Previously, lastTimestamp was advanced before processing messages.
If processMessage threw an error, those messages would be skipped
on the next tick since the timestamp had already moved past them.

Now we advance lastTimestamp after each message is successfully
processed (or after catching an error), ensuring no messages are
lost on retry.

https://claude.ai/code/session_01LgHSAs9XbcvZckCe8xPipj
This commit is contained in:
Claude
2026-02-01 18:12:59 +00:00
parent c255451ac3
commit a904c65975

View File

@@ -358,12 +358,19 @@ async function startMessageLoop(): Promise<void> {
while (true) {
try {
const jids = Object.keys(registeredGroups);
const { messages, newTimestamp } = getNewMessages(jids, lastTimestamp);
lastTimestamp = newTimestamp;
const { messages } = getNewMessages(jids, lastTimestamp);
if (messages.length > 0) logger.info({ count: messages.length }, 'New messages');
for (const msg of messages) await processMessage(msg);
for (const msg of messages) {
try {
await processMessage(msg);
} catch (err) {
logger.error({ err, msg: msg.id }, 'Error processing message');
}
// Advance timestamp after each message to avoid reprocessing on retry
lastTimestamp = msg.timestamp;
saveState();
}
} catch (err) {
logger.error({ err }, 'Error in message loop');
}