diff --git a/packages/backend/src/queue/index.ts b/packages/backend/src/queue/index.ts index cc125a3de..f87b8c1df 100644 --- a/packages/backend/src/queue/index.ts +++ b/packages/backend/src/queue/index.ts @@ -83,14 +83,11 @@ webhookDeliverQueue .on('error', (job: any, err: Error) => webhookLogger.error(`error ${err}`, { job, e: renderError(err) })) .on('stalled', (job) => webhookLogger.warn(`stalled ${getJobInfo(job)} to=${job.data.to}`)); -export function deliver(user: ThinUser, content: unknown, to: string | null) { +export function deliver(content: unknown, to: string | null) { if (content == null) return null; if (to == null) return null; const data = { - user: { - id: user.id, - }, content, to, }; diff --git a/packages/backend/src/queue/processors/deliver.ts b/packages/backend/src/queue/processors/deliver.ts index c581942c7..2185c7bc3 100644 --- a/packages/backend/src/queue/processors/deliver.ts +++ b/packages/backend/src/queue/processors/deliver.ts @@ -9,6 +9,7 @@ import { toPuny } from '@/misc/convert-host.js'; import { StatusError } from '@/misc/fetch.js'; import { shouldSkipInstance } from '@/misc/skipped-instances.js'; import { DeliverJobData } from '@/queue/types.js'; +import { DbResolver } from '@/remote/activitypub/db-resolver.js'; const logger = new Logger('deliver'); @@ -18,13 +19,20 @@ export default async (job: Bull.Job) => { if (await shouldSkipInstance(puny)) return 'skip'; + // get user/actor for signing + const userUri = job.data.content.actor; + if (userUri == null) return 'error: missing actor'; + const user = await new DbResolver().getUserFromApId(userUri); + if (user == null) return 'error: actor not found'; + if (user.host != null) return 'error: actor not local'; + try { if (Array.isArray(job.data.content)) { await Promise.all( - job.data.content.map(x => request(job.data.user, job.data.to, x)) + job.data.content.map(x => request(user, job.data.to, x)) ); } else { - await request(job.data.user, job.data.to, job.data.content); + await request(user, job.data.to, job.data.content); } // Update stats diff --git a/packages/backend/src/queue/types.ts b/packages/backend/src/queue/types.ts index 82bd28703..789e92d9f 100644 --- a/packages/backend/src/queue/types.ts +++ b/packages/backend/src/queue/types.ts @@ -6,10 +6,8 @@ import { Webhook } from '@/models/entities/webhook.js'; import { IActivity } from '@/remote/activitypub/type.js'; export type DeliverJobData = { - /** Actor */ - user: ThinUser; - /** Activity */ - content: unknown; + /** Activity, containing the actor URI */ + content: IActivity; /** inbox URL to deliver */ to: string; }; diff --git a/packages/backend/src/remote/activitypub/deliver-manager.ts b/packages/backend/src/remote/activitypub/deliver-manager.ts index 4bc651c98..0a653ed5d 100644 --- a/packages/backend/src/remote/activitypub/deliver-manager.ts +++ b/packages/backend/src/remote/activitypub/deliver-manager.ts @@ -14,6 +14,7 @@ interface IEveryoneRecipe extends IRecipe { interface IFollowersRecipe extends IRecipe { type: 'Followers'; + followee: ILocalUser; } interface IDirectRecipe extends IRecipe { @@ -32,26 +33,24 @@ const isDirect = (recipe: any): recipe is IDirectRecipe => //#endregion export class DeliverManager { - private actor: { id: User['id']; host: null; }; private activity: any; private recipes: IRecipe[] = []; /** * Constructor - * @param actor Actor * @param activity Activity to deliver */ - constructor(actor: { id: User['id']; host: null; }, activity: any) { - this.actor = actor; + constructor(activity: any) { this.activity = activity; } /** * Add recipe for followers deliver */ - public addFollowersRecipe() { + public addFollowersRecipe(followee: ILocalUser) { const deliver = { type: 'Followers', + followee, } as IFollowersRecipe; this.addRecipe(deliver); @@ -89,8 +88,6 @@ export class DeliverManager { * Execute delivers */ public async execute() { - if (!Users.isLocalUser(this.actor)) return; - const inboxes = new Set(); /* @@ -116,21 +113,25 @@ export class DeliverManager { } } - if (this.recipes.some(r => isFollowers(r))) { - // followers deliver - const followers = await Followings.createQueryBuilder('followings') - // return either the shared inbox (if available) or the individual inbox - .select('COALESCE(followings.followerSharedInbox, followings.followerInbox)', 'inbox') - // so we don't have to make our inboxes Set work as hard - .distinct(true) - // ...for the specific actors followers - .where('followings.followeeId = :actorId', { actorId: this.actor.id }) - // don't deliver to ourselves - .andWhere('followings.followerHost IS NOT NULL') - .getRawMany(); - - followers.forEach(({ inbox }) => inboxes.add(inbox)); - } + await Promise.all( + this.recipes.filter(isFollowers) + .map(recipe => { + // followers deliver + return Followings.createQueryBuilder('followings') + // return either the shared inbox (if available) or the individual inbox + .select('COALESCE(followings.followerSharedInbox, followings.followerInbox)', 'inbox') + // so we don't have to make our inboxes Set work as hard + .distinct(true) + // ...for the specific actors followers + .where('followings.followeeId = :actorId', { actorId: recipe.followee.id }) + // don't deliver to ourselves + .andWhere('followings.followerHost IS NOT NULL') + .getRawMany() + .then(followers => + followers.forEach(({ inbox }) => inboxes.add(inbox)) + ); + }) + ); this.recipes.filter((recipe): recipe is IDirectRecipe => // followers recipes have already been processed @@ -155,7 +156,7 @@ export class DeliverManager { // skip instances as indicated if (instancesToSkip.includes(new URL(inbox).host)) continue; - deliver(this.actor, this.activity, inbox); + deliver(this.activity, inbox); } } } @@ -166,9 +167,9 @@ export class DeliverManager { * @param activity Activity * @param from Followee */ -export async function deliverToFollowers(actor: { id: ILocalUser['id']; host: null; }, activity: any) { - const manager = new DeliverManager(actor, activity); - manager.addFollowersRecipe(); +export async function deliverToFollowers(actor: ILocalUser, activity: any) { + const manager = new DeliverManager(activity); + manager.addFollowersRecipe(actor); await manager.execute(); } @@ -177,8 +178,8 @@ export async function deliverToFollowers(actor: { id: ILocalUser['id']; host: nu * @param activity Activity * @param to Target user */ -export async function deliverToUser(actor: { id: ILocalUser['id']; host: null; }, activity: any, to: IRemoteUser) { - const manager = new DeliverManager(actor, activity); +export async function deliverToUser(activity: any, to: IRemoteUser) { + const manager = new DeliverManager(activity); manager.addDirectRecipe(to); await manager.execute(); } diff --git a/packages/backend/src/remote/activitypub/renderer/read.ts b/packages/backend/src/remote/activitypub/renderer/read.ts deleted file mode 100644 index a30e649f6..000000000 --- a/packages/backend/src/remote/activitypub/renderer/read.ts +++ /dev/null @@ -1,9 +0,0 @@ -import config from '@/config/index.js'; -import { User } from '@/models/entities/user.js'; -import { MessagingMessage } from '@/models/entities/messaging-message.js'; - -export const renderReadActivity = (user: { id: User['id'] }, message: MessagingMessage) => ({ - type: 'Read', - actor: `${config.url}/users/${user.id}`, - object: message.uri, -}); diff --git a/packages/backend/src/server/api/common/read-messaging-message.ts b/packages/backend/src/server/api/common/read-messaging-message.ts index e8e16f319..9f713a9d6 100644 --- a/packages/backend/src/server/api/common/read-messaging-message.ts +++ b/packages/backend/src/server/api/common/read-messaging-message.ts @@ -7,10 +7,6 @@ import { MessagingMessages, UserGroupJoinings, Users } from '@/models/index.js'; import { IdentifiableError } from '@/misc/identifiable-error.js'; import { UserGroup } from '@/models/entities/user-group.js'; import { toArray } from '@/prelude/array.js'; -import { renderReadActivity } from '@/remote/activitypub/renderer/read.js'; -import { renderActivity } from '@/remote/activitypub/renderer/index.js'; -import { deliver } from '@/queue/index.js'; -import orderedCollection from '@/remote/activitypub/renderer/ordered-collection.js'; /** * Mark messages as read @@ -133,18 +129,3 @@ export async function readGroupMessagingMessage( } } } - -export async function deliverReadActivity(user: { id: User['id']; host: null; }, recipient: IRemoteUser, messages: MessagingMessage | MessagingMessage[]) { - const contents = toArray(messages) - .filter(x => x.uri) - .map(x => renderReadActivity(user, x)); - - if (contents.length > 1) { - const collection = orderedCollection(null, contents.length, undefined, undefined, contents); - deliver(user, renderActivity(collection), recipient.inbox); - } else { - for (const content of contents) { - deliver(user, renderActivity(content), recipient.inbox); - } - } -} diff --git a/packages/backend/src/server/api/endpoints/admin/reports/resolve.ts b/packages/backend/src/server/api/endpoints/admin/reports/resolve.ts index f9ff25c88..705dd5a37 100644 --- a/packages/backend/src/server/api/endpoints/admin/reports/resolve.ts +++ b/packages/backend/src/server/api/endpoints/admin/reports/resolve.ts @@ -29,7 +29,7 @@ export default define(meta, paramDef, async (ps, me) => { const actor = await getInstanceActor(); const targetUser = await Users.findOneByOrFail({ id: report.targetUserId }); - deliver(actor, renderActivity(renderFlag(actor, report)), targetUser.inbox); + deliver(renderActivity(renderFlag(actor, report)), targetUser.inbox); } await AbuseUserReports.update(report.id, { diff --git a/packages/backend/src/server/api/endpoints/messaging/messages.ts b/packages/backend/src/server/api/endpoints/messaging/messages.ts index f00b84e49..db7184a0b 100644 --- a/packages/backend/src/server/api/endpoints/messaging/messages.ts +++ b/packages/backend/src/server/api/endpoints/messaging/messages.ts @@ -4,7 +4,7 @@ import define from '@/server/api/define.js'; import { ApiError } from '@/server/api/error.js'; import { getUser } from '@/server/api/common/getters.js'; import { makePaginationQuery } from '@/server/api/common/make-pagination-query.js'; -import { readUserMessagingMessage, readGroupMessagingMessage, deliverReadActivity } from '@/server/api/common/read-messaging-message.js'; +import { readUserMessagingMessage, readGroupMessagingMessage } from '@/server/api/common/read-messaging-message.js'; export const meta = { tags: ['messaging'], @@ -75,11 +75,6 @@ export default define(meta, paramDef, async (ps, user) => { // Mark all as read if (ps.markAsRead) { readUserMessagingMessage(user.id, recipient.id, messages.filter(m => m.recipientId === user.id).map(x => x.id)); - - // リモートユーザーとのメッセージだったら既読配信 - if (Users.isLocalUser(user) && Users.isRemoteUser(recipient)) { - deliverReadActivity(user, recipient, messages); - } } return await Promise.all(messages.map(message => MessagingMessages.pack(message, user, { diff --git a/packages/backend/src/server/api/endpoints/notes/polls/vote.ts b/packages/backend/src/server/api/endpoints/notes/polls/vote.ts index 56819b142..c5ad95af5 100644 --- a/packages/backend/src/server/api/endpoints/notes/polls/vote.ts +++ b/packages/backend/src/server/api/endpoints/notes/polls/vote.ts @@ -133,7 +133,7 @@ export default define(meta, paramDef, async (ps, user) => { if (note.userHost != null) { const pollOwner = await Users.findOneByOrFail({ id: note.userId }) as IRemoteUser; - deliver(user, renderActivity(await renderVote(user, vote, note, poll, pollOwner)), pollOwner.inbox); + deliver(renderActivity(await renderVote(user, vote, note, poll, pollOwner)), pollOwner.inbox); } // リモートフォロワーにUpdate配信 diff --git a/packages/backend/src/server/api/stream/channels/messaging.ts b/packages/backend/src/server/api/stream/channels/messaging.ts index e10ede776..009acf440 100644 --- a/packages/backend/src/server/api/stream/channels/messaging.ts +++ b/packages/backend/src/server/api/stream/channels/messaging.ts @@ -1,7 +1,7 @@ import { UserGroupJoinings, Users, MessagingMessages } from '@/models/index.js'; import { User, ILocalUser, IRemoteUser } from '@/models/entities/user.js'; import { UserGroup } from '@/models/entities/user-group.js'; -import { readUserMessagingMessage, readGroupMessagingMessage, deliverReadActivity } from '@/server/api/common/read-messaging-message.js'; +import { readUserMessagingMessage, readGroupMessagingMessage } from '@/server/api/common/read-messaging-message.js'; import Channel from '@/server/api/stream/channel.js'; import { StreamMessages } from '@/server/api/stream/types.js'; @@ -69,13 +69,6 @@ export default class extends Channel { case 'read': if (this.otherpartyId) { readUserMessagingMessage(this.user!.id, this.otherpartyId, [body.id]); - - // リモートユーザーからのメッセージだったら既読配信 - if (Users.isLocalUser(this.user!) && Users.isRemoteUser(this.otherparty!)) { - MessagingMessages.findOneBy({ id: body.id }).then(message => { - if (message) deliverReadActivity(this.user as ILocalUser, this.otherparty as IRemoteUser, message); - }); - } } else if (this.groupId) { readGroupMessagingMessage(this.user!.id, this.groupId, [body.id]); } diff --git a/packages/backend/src/services/blocking/create.ts b/packages/backend/src/services/blocking/create.ts index 1550e3022..796c98dab 100644 --- a/packages/backend/src/services/blocking/create.ts +++ b/packages/backend/src/services/blocking/create.ts @@ -34,7 +34,7 @@ export default async function(blocker: User, blockee: User): Promise { if (Users.isLocalUser(blocker) && Users.isRemoteUser(blockee) && blocker.federateBlocks) { const content = renderActivity(renderBlock(blocking)); - deliver(blocker, content, blockee.inbox); + deliver(content, blockee.inbox); } } @@ -78,13 +78,13 @@ async function cancelRequest(follower: User, followee: User): Promise { // Send Undo Follow if followee is remote if (Users.isLocalUser(follower) && Users.isRemoteUser(followee)) { const content = renderActivity(renderUndo(renderFollow(follower, followee), follower)); - deliver(follower, content, followee.inbox); + deliver(content, followee.inbox); } // Send Reject if follower is remote if (Users.isRemoteUser(follower) && Users.isLocalUser(followee)) { const content = renderActivity(renderReject(renderFollow(follower, followee, request.requestId!), followee)); - deliver(followee, content, follower.inbox); + deliver(content, follower.inbox); } } @@ -125,7 +125,7 @@ async function unFollow(follower: User, followee: User): Promise { // Send Undo Follow if follower is remote if (Users.isLocalUser(follower) && Users.isRemoteUser(followee)) { const content = renderActivity(renderUndo(renderFollow(follower, followee), follower)); - deliver(follower, content, followee.inbox); + deliver(content, followee.inbox); } } diff --git a/packages/backend/src/services/blocking/delete.ts b/packages/backend/src/services/blocking/delete.ts index 82f92f05a..3dfa8fc44 100644 --- a/packages/backend/src/services/blocking/delete.ts +++ b/packages/backend/src/services/blocking/delete.ts @@ -29,6 +29,6 @@ export default async function(blocker: CacheableUser, blockee: CacheableUser) { // deliver if remote bloking if (Users.isLocalUser(blocker) && Users.isRemoteUser(blockee)) { const content = renderActivity(renderUndo(renderBlock(blocking), blocker)); - deliver(blocker, content, blockee.inbox); + deliver(content, blockee.inbox); } } diff --git a/packages/backend/src/services/following/create.ts b/packages/backend/src/services/following/create.ts index 7ad85dd99..00161f195 100644 --- a/packages/backend/src/services/following/create.ts +++ b/packages/backend/src/services/following/create.ts @@ -146,7 +146,7 @@ export default async function(_follower: { id: User['id'] }, _followee: { id: Us if (Users.isRemoteUser(follower) && Users.isLocalUser(followee) && blocked) { // リモートフォローを受けてブロックしていた場合は、エラーにするのではなくRejectを送り返しておしまい。 const content = renderActivity(renderReject(renderFollow(follower, followee, requestId), followee)); - deliver(followee , content, follower.inbox); + deliver(content, follower.inbox); return; } else if (Users.isRemoteUser(follower) && Users.isLocalUser(followee) && blocking) { // リモートフォローを受けてブロックされているはずの場合だったら、ブロック解除しておく。 @@ -195,6 +195,6 @@ export default async function(_follower: { id: User['id'] }, _followee: { id: Us if (Users.isRemoteUser(follower) && Users.isLocalUser(followee)) { const content = renderActivity(renderAccept(renderFollow(follower, followee, requestId), followee)); - deliver(followee, content, follower.inbox); + deliver(content, follower.inbox); } } diff --git a/packages/backend/src/services/following/delete.ts b/packages/backend/src/services/following/delete.ts index 9a29d1921..60f230683 100644 --- a/packages/backend/src/services/following/delete.ts +++ b/packages/backend/src/services/following/delete.ts @@ -52,13 +52,13 @@ export default async function(follower: { id: User['id']; host: User['host']; ur if (Users.isLocalUser(follower) && Users.isRemoteUser(followee)) { const content = renderActivity(renderUndo(renderFollow(follower, followee), follower)); - deliver(follower, content, followee.inbox); + deliver(content, followee.inbox); } if (Users.isLocalUser(followee) && Users.isRemoteUser(follower)) { // local user has null host const content = renderActivity(renderReject(renderFollow(follower, followee), followee)); - deliver(followee, content, follower.inbox); + deliver(content, follower.inbox); } } diff --git a/packages/backend/src/services/following/reject.ts b/packages/backend/src/services/following/reject.ts index ec98da635..0bbe6fa24 100644 --- a/packages/backend/src/services/following/reject.ts +++ b/packages/backend/src/services/following/reject.ts @@ -99,7 +99,7 @@ async function deliverReject(followee: Local, follower: Remote): Promise { }); const content = renderActivity(renderReject(renderFollow(follower, followee, request?.requestId || undefined), followee)); - deliver(followee, content, follower.inbox); + deliver(content, follower.inbox); } /** diff --git a/packages/backend/src/services/following/requests/accept.ts b/packages/backend/src/services/following/requests/accept.ts index 231075100..6e5c02364 100644 --- a/packages/backend/src/services/following/requests/accept.ts +++ b/packages/backend/src/services/following/requests/accept.ts @@ -27,7 +27,7 @@ export async function acceptFollowRequest(followee: User, follower: User): Promi if (Users.isRemoteUser(follower) && Users.isLocalUser(followee)) { const content = renderActivity(renderAccept(renderFollow(follower, followee, request.requestId!), followee)); - deliver(followee, content, follower.inbox); + deliver(content, follower.inbox); } Users.pack(followee.id, followee, { diff --git a/packages/backend/src/services/following/requests/cancel.ts b/packages/backend/src/services/following/requests/cancel.ts index 4ceac19cb..ae1fd90bc 100644 --- a/packages/backend/src/services/following/requests/cancel.ts +++ b/packages/backend/src/services/following/requests/cancel.ts @@ -17,7 +17,7 @@ export async function cancelFollowRequest(followee: User, follower: User): Promi const content = renderActivity(renderUndo(renderFollow(follower, followee), follower)); if (Users.isLocalUser(follower)) { - deliver(follower, content, followee.inbox); + deliver(content, followee.inbox); } } diff --git a/packages/backend/src/services/following/requests/create.ts b/packages/backend/src/services/following/requests/create.ts index 446f2de40..396089b1a 100644 --- a/packages/backend/src/services/following/requests/create.ts +++ b/packages/backend/src/services/following/requests/create.ts @@ -64,6 +64,6 @@ export async function createFollowRequest(follower: User, followee: User, reques if (Users.isLocalUser(follower) && Users.isRemoteUser(followee)) { const content = renderActivity(renderFollow(follower, followee)); - deliver(follower, content, followee.inbox); + deliver(content, followee.inbox); } } diff --git a/packages/backend/src/services/messages/create.ts b/packages/backend/src/services/messages/create.ts index 4a0ea53a8..c6d58b59a 100644 --- a/packages/backend/src/services/messages/create.ts +++ b/packages/backend/src/services/messages/create.ts @@ -97,7 +97,7 @@ export async function createMessage(user: { id: User['id']; host: User['host']; const activity = renderActivity(renderCreate(await renderNote(note, false, true), note)); - deliver(user, activity, recipientUser.inbox); + deliver(activity, recipientUser.inbox); } return messageObj; } diff --git a/packages/backend/src/services/messages/delete.ts b/packages/backend/src/services/messages/delete.ts index 25f49ae50..1082ba8a7 100644 --- a/packages/backend/src/services/messages/delete.ts +++ b/packages/backend/src/services/messages/delete.ts @@ -22,7 +22,7 @@ async function postDeleteMessage(message: MessagingMessage): Promise { if (Users.isLocalUser(user) && Users.isRemoteUser(recipient)) { const activity = renderActivity(renderDelete(renderTombstone(`${config.url}/notes/${message.id}`), user)); - deliver(user, activity, recipient.inbox); + deliver(activity, recipient.inbox); } } else if (message.groupId) { publishGroupMessagingStream(message.groupId, 'deleted', message.id); diff --git a/packages/backend/src/services/note/create.ts b/packages/backend/src/services/note/create.ts index 8f48bc12a..5fddfdcd3 100644 --- a/packages/backend/src/services/note/create.ts +++ b/packages/backend/src/services/note/create.ts @@ -432,7 +432,7 @@ export default async (user: { id: User['id']; username: User['username']; host: if (Users.isLocalUser(user) && !data.localOnly) { (async () => { const noteActivity = renderActivity(await renderNoteOrRenoteActivity(note)); - const dm = new DeliverManager(user, noteActivity); + const dm = new DeliverManager(noteActivity); // Delivered to remote users who have been mentioned for (const u of mentionedUsers.filter(u => Users.isRemoteUser(u))) { @@ -453,7 +453,7 @@ export default async (user: { id: User['id']; username: User['username']; host: // Deliver to followers if (['public', 'home', 'followers'].includes(note.visibility)) { - dm.addFollowersRecipe(); + dm.addFollowersRecipe(user); } if (['public'].includes(note.visibility)) { diff --git a/packages/backend/src/services/note/delete.ts b/packages/backend/src/services/note/delete.ts index f22ce80db..f8e7cd10b 100644 --- a/packages/backend/src/services/note/delete.ts +++ b/packages/backend/src/services/note/delete.ts @@ -60,8 +60,8 @@ export async function deleteNotes(notes: Note[], user?: User): Promise { // Compute addressing information. // Since we do not send any actual content, we send all note deletions to everyone. - const manager = new DeliverManager(fetchedUser, content); - manager.addFollowersRecipe(); + const manager = new DeliverManager(content); + manager.addFollowersRecipe(fetchedUser); manager.addEveryone(); // Check mentioned users, since not all may have a shared inbox. await Promise.all( diff --git a/packages/backend/src/services/note/reaction/create.ts b/packages/backend/src/services/note/reaction/create.ts index d50761a29..e35ceb991 100644 --- a/packages/backend/src/services/note/reaction/create.ts +++ b/packages/backend/src/services/note/reaction/create.ts @@ -130,14 +130,14 @@ export async function createReaction(user: { id: User['id']; host: User['host']; //#region 配信 if (Users.isLocalUser(user) && !note.localOnly) { const content = renderActivity(await renderLike(record, note)); - const dm = new DeliverManager(user, content); + const dm = new DeliverManager(content); if (note.userHost !== null) { const reactee = await Users.findOneBy({ id: note.userId }); dm.addDirectRecipe(reactee as IRemoteUser); } if (['public', 'home', 'followers'].includes(note.visibility)) { - dm.addFollowersRecipe(); + dm.addFollowersRecipe(user); } else if (note.visibility === 'specified') { const visibleUsers = await Promise.all(note.visibleUserIds.map(id => Users.findOneBy({ id }))); for (const u of visibleUsers.filter(u => u && Users.isRemoteUser(u))) { diff --git a/packages/backend/src/services/note/reaction/delete.ts b/packages/backend/src/services/note/reaction/delete.ts index 616a30015..060fe43de 100644 --- a/packages/backend/src/services/note/reaction/delete.ts +++ b/packages/backend/src/services/note/reaction/delete.ts @@ -46,12 +46,12 @@ export async function deleteReaction(user: { id: User['id']; host: User['host']; //#region 配信 if (Users.isLocalUser(user) && !note.localOnly) { const content = renderActivity(renderUndo(await renderLike(exist, note), user)); - const dm = new DeliverManager(user, content); + const dm = new DeliverManager(content); if (note.userHost !== null) { const reactee = await Users.findOneBy({ id: note.userId }); dm.addDirectRecipe(reactee as IRemoteUser); } - dm.addFollowersRecipe(); + dm.addFollowersRecipe(user); dm.execute(); } //#endregion diff --git a/packages/backend/src/services/relay.ts b/packages/backend/src/services/relay.ts index de7155ea0..76adb991c 100644 --- a/packages/backend/src/services/relay.ts +++ b/packages/backend/src/services/relay.ts @@ -36,9 +36,8 @@ export async function addRelay(inbox: string): Promise { }).then(x => Relays.findOneByOrFail(x.identifiers[0])); const relayActor = await getRelayActor(); - const follow = renderFollowRelay(relay, relayActor); - const activity = renderActivity(follow); - deliver(relayActor, activity, relay.inbox); + const activity = renderActivity(renderFollowRelay(relay, relayActor)); + deliver(activity, relay.inbox); return relay; } @@ -53,17 +52,14 @@ export async function removeRelay(inbox: string): Promise { } const relayActor = await getRelayActor(); - const follow = renderFollowRelay(relay, relayActor); - const undo = renderUndo(follow, relayActor); - const activity = renderActivity(undo); - deliver(relayActor, activity, relay.inbox); + const activity = renderActivity(renderUndo(renderFollowRelay(relay, relayActor), relayActor)); + deliver(activity, relay.inbox); await Relays.delete(relay.id); } export async function listRelay(): Promise { - const relays = await Relays.find(); - return relays; + return await Relays.find(); } export async function relayAccepted(id: string): Promise { @@ -94,7 +90,7 @@ export async function deliverToRelays(user: { id: User['id']; host: null; }, act const signed = await attachLdSignature(copy, user); for (const relay of relays) { - deliver(user, signed, relay.inbox); + deliver(signed, relay.inbox); } } @@ -112,6 +108,6 @@ export async function deliverMultipleToRelays(user: User, activities: any[]): Pr })); for (const relay of relays) { - deliver(user, content, relay.inbox); + deliver(content, relay.inbox); } } diff --git a/packages/backend/src/services/suspend-user.ts b/packages/backend/src/services/suspend-user.ts index 11e6266a0..d08683008 100644 --- a/packages/backend/src/services/suspend-user.ts +++ b/packages/backend/src/services/suspend-user.ts @@ -13,7 +13,7 @@ export async function doPostSuspend(user: { id: User['id']; host: User['host'] } const content = renderActivity(renderDelete(`${config.url}/users/${user.id}`, user)); // deliver to all of known network - const dm = new DeliverManager(user, content); + const dm = new DeliverManager(content); dm.addEveryone(); await dm.execute(); } diff --git a/packages/backend/src/services/unsuspend-user.ts b/packages/backend/src/services/unsuspend-user.ts index 766b10f21..85a886be1 100644 --- a/packages/backend/src/services/unsuspend-user.ts +++ b/packages/backend/src/services/unsuspend-user.ts @@ -32,7 +32,7 @@ export async function doPostUnsuspend(user: User): Promise { } for (const inbox of queue) { - deliver(user as any, content, inbox); + deliver(content, inbox); } } }