perf(federation): always prefer the shared inbox

Followers-only posts and DMs went to each recipient's personal inbox,
so a followers-only post was sent once per follower on the same server.
Mastodon, GoToSocial and Iceshrimp.NET always use the shared inbox.
Only activities with bcc or bto still go to personal inboxes.

Based on Akkoma a80444041.

Co-authored-by: Oneric <oneric@oneric.stub>
This commit is contained in:
Lain Soykaf 2026-10-27 20:45:32 +04:00
commit 5a5f4794d3
No known key found for this signature in database
3 changed files with 52 additions and 29 deletions

View file

@ -137,7 +137,7 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do
assert Publisher.determine_inbox(activity, user) == "http://example.com/inbox"
end
test "it returns inbox for messages involving single recipients in total" do
test "it returns sharedInbox for messages to a single recipient" do
user =
insert(:user, %{
shared_inbox: "http://example.com/inbox",
@ -148,6 +148,46 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do
data: %{"to" => [user.ap_id], "cc" => []}
}
assert Publisher.determine_inbox(activity, user) == "http://example.com/inbox"
end
test "it returns sharedInbox for followers-only messages" do
user =
insert(:user, %{
shared_inbox: "http://example.com/inbox",
inbox: "http://example.com/personal-inbox"
})
author = insert(:user)
activity = %Activity{
data: %{"to" => [author.follower_address], "cc" => []}
}
assert Publisher.determine_inbox(activity, user) == "http://example.com/inbox"
end
test "it returns inbox for messages with bcc or bto, which needs personal inboxes" do
user =
insert(:user, %{
shared_inbox: "http://example.com/inbox",
inbox: "http://example.com/personal-inbox"
})
for field <- ["bcc", "bto"] do
activity = %Activity{
data: %{"to" => [@as_public], "cc" => [], field => [user.ap_id]}
}
assert Publisher.determine_inbox(activity, user) == "http://example.com/personal-inbox"
end
end
test "it returns inbox when the user has no sharedInbox" do
user = insert(:user, %{shared_inbox: nil, inbox: "http://example.com/personal-inbox"})
activity = %Activity{data: %{"to" => [@as_public], "cc" => []}}
assert Publisher.determine_inbox(activity, user) == "http://example.com/personal-inbox"
end
end