fix(federation): avoid duplicate activity delivery (#8429)
* prefer shared inbox over individual inbox * no new shared inbox for direct recipes * fix type error
This commit is contained in:
parent
f7030d4a42
commit
1033e8e57f
|
@ -79,9 +79,13 @@ export default class DeliverManager {
|
||||||
|
|
||||||
const inboxes = new Set<string>();
|
const inboxes = new Set<string>();
|
||||||
|
|
||||||
// build inbox list
|
/*
|
||||||
for (const recipe of this.recipes) {
|
build inbox list
|
||||||
if (isFollowers(recipe)) {
|
|
||||||
|
Process follower recipes first to avoid duplication when processing
|
||||||
|
direct recipes later.
|
||||||
|
*/
|
||||||
|
if (this.recipes.some(r => isFollowers(r)) {
|
||||||
// followers deliver
|
// followers deliver
|
||||||
// TODO: SELECT DISTINCT ON ("followerSharedInbox") "followerSharedInbox" みたいな問い合わせにすればよりパフォーマンス向上できそう
|
// TODO: SELECT DISTINCT ON ("followerSharedInbox") "followerSharedInbox" みたいな問い合わせにすればよりパフォーマンス向上できそう
|
||||||
// ただ、sharedInboxがnullなリモートユーザーも稀におり、その対応ができなさそう?
|
// ただ、sharedInboxがnullなリモートユーザーも稀におり、その対応ができなさそう?
|
||||||
|
@ -103,13 +107,18 @@ export default class DeliverManager {
|
||||||
const inbox = following.followerSharedInbox || following.followerInbox;
|
const inbox = following.followerSharedInbox || following.followerInbox;
|
||||||
inboxes.add(inbox);
|
inboxes.add(inbox);
|
||||||
}
|
}
|
||||||
} else if (isDirect(recipe)) {
|
|
||||||
// direct deliver
|
|
||||||
const inbox = recipe.to.inbox;
|
|
||||||
if (inbox) inboxes.add(inbox);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.recipes.filter((recipe): recipe is IDirectRecipe => {
|
||||||
|
// followers recipes have already been processed
|
||||||
|
isDirect(recipe)
|
||||||
|
// check that shared inbox has not been added yet
|
||||||
|
&& !(recipe.to.sharedInbox && inboxes.has(recipe.to.sharedInbox))
|
||||||
|
// check that they actually have an inbox
|
||||||
|
&& recipe.to.inbox
|
||||||
|
})
|
||||||
|
.forEach(recipe => inboxes.add(recipe.to.inbox));
|
||||||
|
|
||||||
// deliver
|
// deliver
|
||||||
for (const inbox of inboxes) {
|
for (const inbox of inboxes) {
|
||||||
deliver(this.actor, this.activity, inbox);
|
deliver(this.actor, this.activity, inbox);
|
||||||
|
|
Loading…
Reference in New Issue