Skip to content

Commit ad03fbd

Browse files
committed
fix: skip recent deleted message empty react changes
1 parent 0cc7994 commit ad03fbd

File tree

3 files changed

+88
-33
lines changed

3 files changed

+88
-33
lines changed

ts/session/apis/open_group_api/sogsv3/sogsApiV3.ts

Lines changed: 25 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import { createSwarmMessageSentFromUs } from '../../../../models/messageFactory'
3636
import { Data } from '../../../../data/data';
3737
import { processMessagesUsingCache } from './sogsV3MutationCache';
3838
import { destroyMessagesAndUpdateRedux } from '../../../../util/expiringMessages';
39+
import { sogsRollingDeletions } from './sogsRollingDeletions';
3940

4041
/**
4142
* Get the convo matching those criteria and make sure it is an opengroup convo, or return null.
@@ -155,29 +156,28 @@ async function filterOutMessagesInvalidSignature(
155156
return signaturesValidMessages;
156157
}
157158

158-
let totalDeletedMessages = 0;
159159
const handleSogsV3DeletedMessages = async (
160160
messages: Array<OpenGroupMessageV4>,
161161
serverUrl: string,
162162
roomId: string
163163
) => {
164-
const deletions = messages.filter(m => Boolean(m.deleted));
165-
const exceptDeletion = messages.filter(m => !m.deleted);
166-
if (!deletions.length) {
167-
return messages;
164+
const messagesDeleted = messages.filter(m => Boolean(m.deleted));
165+
const messagesWithoutDeleted = messages.filter(m => !m.deleted);
166+
if (!messagesDeleted.length) {
167+
return messagesWithoutDeleted;
168168
}
169-
totalDeletedMessages += deletions.length;
170-
console.warn(
171-
JSON.stringify({
172-
totalDeletedMessages,
173-
})
174-
);
175-
const allIdsRemoved = deletions.map(m => m.id);
169+
170+
const allIdsRemoved = messagesDeleted.map(m => m.id);
171+
176172
try {
177173
const convoId = getOpenGroupV2ConversationId(serverUrl, roomId);
178174
const convo = getConversationController().get(convoId);
179175
const messageIds = await Data.getMessageIdsFromServerIds(allIdsRemoved, convo.id);
180176

177+
allIdsRemoved.forEach(removedId => {
178+
sogsRollingDeletions.addMessageDeletedId(convoId, removedId);
179+
});
180+
181181
if (messageIds && messageIds.length) {
182182
await destroyMessagesAndUpdateRedux(
183183
messageIds.map(messageId => ({
@@ -189,14 +189,9 @@ const handleSogsV3DeletedMessages = async (
189189
} catch (e) {
190190
window?.log?.warn('handleDeletions failed:', e);
191191
}
192-
return exceptDeletion;
192+
return messagesWithoutDeleted;
193193
};
194194

195-
// tslint:disable-next-line: one-variable-per-declaration
196-
let totalEmptyReactions = 0,
197-
totalMessagesWithResolvedBlindedIdsIfFound = 0,
198-
totalMessageReactions = 0;
199-
200195
// tslint:disable-next-line: max-func-body-length cyclomatic-complexity
201196
const handleMessagesResponseV4 = async (
202197
messages: Array<OpenGroupMessageV4>,
@@ -296,8 +291,6 @@ const handleMessagesResponseV4 = async (
296291
const incomingMessageSeqNo = compact(messages.map(n => n.seqno));
297292
const maxNewMessageSeqNo = Math.max(...incomingMessageSeqNo);
298293

299-
totalMessagesWithResolvedBlindedIdsIfFound += messagesWithResolvedBlindedIdsIfFound.length;
300-
301294
for (let index = 0; index < messagesWithResolvedBlindedIdsIfFound.length; index++) {
302295
const msgToHandle = messagesWithResolvedBlindedIdsIfFound[index];
303296
try {
@@ -323,25 +316,24 @@ const handleMessagesResponseV4 = async (
323316
await OpenGroupData.saveV2OpenGroupRoom(roomInfosRefreshed);
324317

325318
const messagesWithReactions = messages.filter(m => m.reactions !== undefined);
326-
const messagesWithEmptyReactions = messagesWithReactions.filter(m => isEmpty(m.reactions));
327-
328-
totalMessageReactions += messagesWithReactions.length;
329-
totalEmptyReactions += messagesWithEmptyReactions.length;
330-
console.warn(
331-
JSON.stringify({
332-
totalMessagesWithResolvedBlindedIdsIfFound,
333-
totalMessageReactions,
334-
totalEmptyReactions,
335-
})
336-
);
337319

338320
if (messagesWithReactions.length > 0) {
339321
const conversationId = getOpenGroupV2ConversationId(serverUrl, roomId);
340322
const groupConvo = getConversationController().get(conversationId);
341323
if (groupConvo && groupConvo.isOpenGroupV2()) {
342-
for (const message of messagesWithReactions) {
324+
for (const messageWithReaction of messagesWithReactions) {
325+
if (isEmpty(messageWithReaction.reactions)) {
326+
/*
327+
* When a message is deleted from the server, we get the deleted event as a data: null on the message itself
328+
* and an update on its reactions.
329+
* But, because we just deleted that message, we can skip trying to udpate its reactions: it's not in the DB anymore.
330+
*/
331+
if (sogsRollingDeletions.hasMessageDeletedId(conversationId, messageWithReaction.id)) {
332+
continue;
333+
}
334+
}
343335
void groupConvo.queueJob(async () => {
344-
await processMessagesUsingCache(serverUrl, roomId, message);
336+
await processMessagesUsingCache(serverUrl, roomId, messageWithReaction);
345337
});
346338
}
347339
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import { RingBuffer } from '../../../utils/RingBuffer';
2+
3+
const rollingDeletedMessageIds: Map<string, RingBuffer<number>> = new Map();
4+
5+
// keep 2000 deleted message ids in memory
6+
const perRoomRollingRemovedIds = 2000;
7+
8+
const addMessageDeletedId = (conversationId: string, messageDeletedId: number) => {
9+
if (!rollingDeletedMessageIds.has(conversationId)) {
10+
rollingDeletedMessageIds.set(conversationId, new RingBuffer<number>(perRoomRollingRemovedIds));
11+
}
12+
const ringBuffer = rollingDeletedMessageIds.get(conversationId);
13+
if (!ringBuffer) {
14+
return;
15+
}
16+
ringBuffer.add(messageDeletedId);
17+
};
18+
19+
20+
const hasMessageDeletedId = (conversationId: string, messageDeletedId: number) => {
21+
if (!rollingDeletedMessageIds.has(conversationId)) {
22+
return false;
23+
}
24+
25+
const messageIdWasDeletedRecently = rollingDeletedMessageIds
26+
?.get(conversationId)
27+
?.has(messageDeletedId);
28+
29+
return messageIdWasDeletedRecently;
30+
};
31+
32+
export const sogsRollingDeletions = { addMessageDeletedId, hasMessageDeletedId };

ts/session/utils/RingBuffer.ts

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
export class RingBuffer<T> {
2+
private buffer: Array<T> = [];
3+
private readonly capacity: number;
4+
5+
constructor(capacity: number) {
6+
this.capacity = capacity;
7+
}
8+
9+
public getCapacity(): number {
10+
return this.capacity;
11+
}
12+
13+
public add(item: T) {
14+
this.buffer.push(item);
15+
this.crop();
16+
}
17+
18+
public has(item: T) {
19+
return this.buffer.includes(item);
20+
}
21+
22+
public clear() {
23+
this.buffer = [];
24+
}
25+
26+
private crop() {
27+
while (this.buffer.length > this.capacity) {
28+
this.buffer.shift();
29+
}
30+
}
31+
}

0 commit comments

Comments
 (0)