Skip to content

Commit 8612079

Browse files
authored
fix: prevent reporting delivery for already reported message (#1643)
1 parent 0cd6009 commit 8612079

File tree

2 files changed

+94
-0
lines changed

2 files changed

+94
-0
lines changed

src/channel.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1936,6 +1936,15 @@ export class Channel {
19361936
deliveredAt: event.created_at,
19371937
lastDeliveredMessageId: event.last_delivered_message_id,
19381938
});
1939+
1940+
const client = this.getClient();
1941+
const isOwnEvent = event.user?.id === client.user?.id;
1942+
1943+
// make sure not to report deliveries that were
1944+
// already confirmed from own user from another device
1945+
if (isOwnEvent) {
1946+
client.syncDeliveredCandidates([this]);
1947+
}
19391948
}
19401949
break;
19411950
case 'user.watching.start':

test/unit/channel.test.js

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,7 @@ describe('Channel count unread', function () {
213213

214214
describe('Channel _handleChannelEvent', function () {
215215
const user = { id: 'user' };
216+
const otherUser = { id: 'other-user' };
216217
let client;
217218
let channel;
218219

@@ -880,6 +881,90 @@ describe('Channel _handleChannelEvent', function () {
880881
event.last_delivered_message_id,
881882
);
882883
});
884+
885+
it('prevents reporting delivery just reported', () => {
886+
// enable delivery events
887+
client._addChannelConfig({
888+
cid: channel.cid,
889+
config: { ...channel.getConfig(), delivery_events: true },
890+
});
891+
channel.state.read[user.id] = initialReadState;
892+
893+
channel._handleChannelEvent({
894+
type: 'message.new',
895+
user: otherUser,
896+
message: generateMsg({
897+
id: messageDeliveredEvent.last_delivered_message_id,
898+
date: messageDeliveredEvent.last_delivered_at,
899+
}),
900+
});
901+
expect(client.messageDeliveryReporter.deliveryReportCandidates.size).toBe(1);
902+
expect(
903+
client.messageDeliveryReporter.deliveryReportCandidates.get(channel.cid),
904+
).toBe(messageDeliveredEvent.last_delivered_message_id);
905+
906+
channel._handleChannelEvent(messageDeliveredEvent);
907+
expect(client.messageDeliveryReporter.deliveryReportCandidates.size).toBe(0);
908+
});
909+
910+
it('keeps reporting delivery if having newer deliveries', () => {
911+
// enable delivery events
912+
client._addChannelConfig({
913+
cid: channel.cid,
914+
config: { ...channel.getConfig(), delivery_events: true },
915+
});
916+
channel.state.read[user.id] = initialReadState;
917+
const newerMessage = generateMsg({
918+
id: 'some-other-id',
919+
date: new Date(3000).toISOString(),
920+
});
921+
channel._handleChannelEvent({
922+
type: 'message.new',
923+
user: otherUser,
924+
message: newerMessage,
925+
});
926+
927+
expect(client.messageDeliveryReporter.deliveryReportCandidates.size).toBe(1);
928+
expect(
929+
client.messageDeliveryReporter.deliveryReportCandidates.get(channel.cid),
930+
).toBe(newerMessage.id);
931+
932+
// event refers to a message delivered 1000ms earlier than newerMessage - still want to report the newerMessage
933+
channel._handleChannelEvent(messageDeliveredEvent);
934+
expect(client.messageDeliveryReporter.deliveryReportCandidates.size).toBe(1);
935+
expect(
936+
client.messageDeliveryReporter.deliveryReportCandidates.get(channel.cid),
937+
).toBe(newerMessage.id);
938+
});
939+
940+
it("does not sync the delivery buffer upon other user's delivery confirmation", () => {
941+
// enable delivery events
942+
client._addChannelConfig({
943+
cid: channel.cid,
944+
config: { ...channel.getConfig(), delivery_events: true },
945+
});
946+
channel.state.read[user.id] = initialReadState;
947+
948+
channel._handleChannelEvent({
949+
type: 'message.new',
950+
user: otherUser,
951+
message: generateMsg({
952+
id: messageDeliveredEvent.last_delivered_message_id,
953+
date: messageDeliveredEvent.last_delivered_at,
954+
}),
955+
});
956+
expect(client.messageDeliveryReporter.deliveryReportCandidates.size).toBe(1);
957+
expect(
958+
client.messageDeliveryReporter.deliveryReportCandidates.get(channel.cid),
959+
).toBe(messageDeliveredEvent.last_delivered_message_id);
960+
961+
channel._handleChannelEvent({ ...messageDeliveredEvent, user: otherUser });
962+
expect(client.messageDeliveryReporter.deliveryReportCandidates.size).toBe(1);
963+
// the originally planned message id is kept to be reported
964+
expect(
965+
client.messageDeliveryReporter.deliveryReportCandidates.get(channel.cid),
966+
).toBe(messageDeliveredEvent.last_delivered_message_id);
967+
});
883968
});
884969

885970
it('should include unread_messages for message events from another user', () => {

0 commit comments

Comments
 (0)