Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions src/channel.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1936,6 +1936,15 @@ export class Channel {
deliveredAt: event.created_at,
lastDeliveredMessageId: event.last_delivered_message_id,
});

const client = this.getClient();
const isOwnEvent = event.user?.id === client.user?.id;

// make sure not to report deliveries that were
// already confirmed from own user from another device
if (isOwnEvent) {
client.syncDeliveredCandidates([this]);
}
}
break;
case 'user.watching.start':
Expand Down
85 changes: 85 additions & 0 deletions test/unit/channel.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,7 @@ describe('Channel count unread', function () {

describe('Channel _handleChannelEvent', function () {
const user = { id: 'user' };
const otherUser = { id: 'other-user' };
let client;
let channel;

Expand Down Expand Up @@ -880,6 +881,90 @@ describe('Channel _handleChannelEvent', function () {
event.last_delivered_message_id,
);
});

it('prevents reporting delivery just reported', () => {
// enable delivery events
client._addChannelConfig({
cid: channel.cid,
config: { ...channel.getConfig(), delivery_events: true },
});
channel.state.read[user.id] = initialReadState;

channel._handleChannelEvent({
type: 'message.new',
user: otherUser,
message: generateMsg({
id: messageDeliveredEvent.last_delivered_message_id,
date: messageDeliveredEvent.last_delivered_at,
}),
});
expect(client.messageDeliveryReporter.deliveryReportCandidates.size).toBe(1);
expect(
client.messageDeliveryReporter.deliveryReportCandidates.get(channel.cid),
).toBe(messageDeliveredEvent.last_delivered_message_id);

channel._handleChannelEvent(messageDeliveredEvent);
expect(client.messageDeliveryReporter.deliveryReportCandidates.size).toBe(0);
});

it('keeps reporting delivery if having newer deliveries', () => {
// enable delivery events
client._addChannelConfig({
cid: channel.cid,
config: { ...channel.getConfig(), delivery_events: true },
});
channel.state.read[user.id] = initialReadState;
const newerMessage = generateMsg({
id: 'some-other-id',
date: new Date(3000).toISOString(),
});
channel._handleChannelEvent({
type: 'message.new',
user: otherUser,
message: newerMessage,
});

expect(client.messageDeliveryReporter.deliveryReportCandidates.size).toBe(1);
expect(
client.messageDeliveryReporter.deliveryReportCandidates.get(channel.cid),
).toBe(newerMessage.id);

// event refers to a message delivered 1000ms earlier than newerMessage - still want to report the newerMessage
channel._handleChannelEvent(messageDeliveredEvent);
expect(client.messageDeliveryReporter.deliveryReportCandidates.size).toBe(1);
expect(
client.messageDeliveryReporter.deliveryReportCandidates.get(channel.cid),
).toBe(newerMessage.id);
});

it("does not sync the delivery buffer upon other user's delivery confirmation", () => {
// enable delivery events
client._addChannelConfig({
cid: channel.cid,
config: { ...channel.getConfig(), delivery_events: true },
});
channel.state.read[user.id] = initialReadState;

channel._handleChannelEvent({
type: 'message.new',
user: otherUser,
message: generateMsg({
id: messageDeliveredEvent.last_delivered_message_id,
date: messageDeliveredEvent.last_delivered_at,
}),
});
expect(client.messageDeliveryReporter.deliveryReportCandidates.size).toBe(1);
expect(
client.messageDeliveryReporter.deliveryReportCandidates.get(channel.cid),
).toBe(messageDeliveredEvent.last_delivered_message_id);

channel._handleChannelEvent({ ...messageDeliveredEvent, user: otherUser });
expect(client.messageDeliveryReporter.deliveryReportCandidates.size).toBe(1);
// the originally planned message id is kept to be reported
expect(
client.messageDeliveryReporter.deliveryReportCandidates.get(channel.cid),
).toBe(messageDeliveredEvent.last_delivered_message_id);
});
});

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