X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Flib%2Factivitypub%2Fsend%2Futils.ts;h=44a8926e52b546dd7d4d59ddf59c684a55d1eacb;hb=e307e4fce39853d445d086f92b8c556c363ee15d;hp=1faae1d84fe986d9acf644c76c680d96e20dcda4;hpb=2284f202070aa2e49156cc52b3b1596a7d5aadec;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/lib/activitypub/send/utils.ts b/server/lib/activitypub/send/utils.ts index 1faae1d84..44a8926e5 100644 --- a/server/lib/activitypub/send/utils.ts +++ b/server/lib/activitypub/send/utils.ts @@ -4,25 +4,31 @@ import { logger } from '../../../helpers/logger' import { ActorModel } from '../../../models/activitypub/actor' import { ActorFollowModel } from '../../../models/activitypub/actor-follow' import { JobQueue } from '../../job-queue' -import { VideoModel } from '../../../models/video/video' import { getActorsInvolvedInVideo, getAudienceFromFollowersOf, getRemoteVideoAudience } from '../audience' -import { getServerActor } from '../../../helpers/utils' import { afterCommitIfTransaction } from '../../../helpers/database-utils' +import { MActor, MActorId, MActorLight, MActorWithInboxes, MVideoAccountLight, MVideoId, MVideoImmutable } from '../../../typings/models' +import { getServerActor } from '@server/models/application/application' +import { ContextType } from '@shared/models/activitypub/context' async function sendVideoRelatedActivity (activityBuilder: (audience: ActivityAudience) => Activity, options: { - byActor: ActorModel, - video: VideoModel, + byActor: MActorLight + video: MVideoImmutable | MVideoAccountLight transaction?: Transaction + contextType?: ContextType }) { - const actorsInvolvedInVideo = await getActorsInvolvedInVideo(options.video, options.transaction) + const { byActor, video, transaction, contextType } = options + + const actorsInvolvedInVideo = await getActorsInvolvedInVideo(video, transaction) // Send to origin - if (options.video.isOwned() === false) { - const audience = getRemoteVideoAudience(options.video, actorsInvolvedInVideo) + if (video.isOwned() === false) { + const accountActor = (video as MVideoAccountLight).VideoChannel?.Account?.Actor || await ActorModel.loadAccountActorByVideoId(video.id) + + const audience = getRemoteVideoAudience(accountActor, actorsInvolvedInVideo) const activity = activityBuilder(audience) - return afterCommitIfTransaction(options.transaction, () => { - return unicastTo(activity, options.byActor, options.video.VideoChannel.Account.Actor.sharedInboxUrl) + return afterCommitIfTransaction(transaction, () => { + return unicastTo(activity, byActor, accountActor.getSharedInbox(), contextType) }) } @@ -30,16 +36,16 @@ async function sendVideoRelatedActivity (activityBuilder: (audience: ActivityAud const audience = getAudienceFromFollowersOf(actorsInvolvedInVideo) const activity = activityBuilder(audience) - const actorsException = [ options.byActor ] + const actorsException = [ byActor ] - return broadcastToFollowers(activity, options.byActor, actorsInvolvedInVideo, options.transaction, actorsException) + return broadcastToFollowers(activity, byActor, actorsInvolvedInVideo, transaction, actorsException, contextType) } async function forwardVideoRelatedActivity ( activity: Activity, t: Transaction, - followersException: ActorModel[] = [], - video: VideoModel + followersException: MActorWithInboxes[], + video: MVideoId ) { // Mastodon does not add our announces in audience, so we forward to them manually const additionalActors = await getActorsInvolvedInVideo(video, t) @@ -51,7 +57,7 @@ async function forwardVideoRelatedActivity ( async function forwardActivity ( activity: Activity, t: Transaction, - followersException: ActorModel[] = [], + followersException: MActorWithInboxes[] = [], additionalFollowerUrls: string[] = [] ) { logger.info('Forwarding activity %s.', activity.id) @@ -85,28 +91,30 @@ async function forwardActivity ( async function broadcastToFollowers ( data: any, - byActor: ActorModel, - toFollowersOf: ActorModel[], + byActor: MActorId, + toFollowersOf: MActorId[], t: Transaction, - actorsException: ActorModel[] = [] + actorsException: MActorWithInboxes[] = [], + contextType?: ContextType ) { const uris = await computeFollowerUris(toFollowersOf, actorsException, t) - return afterCommitIfTransaction(t, () => broadcastTo(uris, data, byActor)) + return afterCommitIfTransaction(t, () => broadcastTo(uris, data, byActor, contextType)) } async function broadcastToActors ( data: any, - byActor: ActorModel, - toActors: ActorModel[], + byActor: MActorId, + toActors: MActor[], t?: Transaction, - actorsException: ActorModel[] = [] + actorsException: MActorWithInboxes[] = [], + contextType?: ContextType ) { const uris = await computeUris(toActors, actorsException) - return afterCommitIfTransaction(t, () => broadcastTo(uris, data, byActor)) + return afterCommitIfTransaction(t, () => broadcastTo(uris, data, byActor, contextType)) } -function broadcastTo (uris: string[], data: any, byActor: ActorModel) { +function broadcastTo (uris: string[], data: any, byActor: MActorId, contextType?: ContextType) { if (uris.length === 0) return undefined logger.debug('Creating broadcast job.', { uris }) @@ -114,19 +122,21 @@ function broadcastTo (uris: string[], data: any, byActor: ActorModel) { const payload = { uris, signatureActorId: byActor.id, - body: data + body: data, + contextType } return JobQueue.Instance.createJob({ type: 'activitypub-http-broadcast', payload }) } -function unicastTo (data: any, byActor: ActorModel, toActorUrl: string) { +function unicastTo (data: any, byActor: MActorId, toActorUrl: string, contextType?: ContextType) { logger.debug('Creating unicast job.', { uri: toActorUrl }) const payload = { uri: toActorUrl, signatureActorId: byActor.id, - body: data + body: data, + contextType } JobQueue.Instance.createJob({ type: 'activitypub-http-unicast', payload }) @@ -145,32 +155,32 @@ export { // --------------------------------------------------------------------------- -async function computeFollowerUris (toFollowersOf: ActorModel[], actorsException: ActorModel[], t: Transaction) { +async function computeFollowerUris (toFollowersOf: MActorId[], actorsException: MActorWithInboxes[], t: Transaction) { const toActorFollowerIds = toFollowersOf.map(a => a.id) const result = await ActorFollowModel.listAcceptedFollowerSharedInboxUrls(toActorFollowerIds, t) const sharedInboxesException = await buildSharedInboxesException(actorsException) - return result.data.filter(sharedInbox => sharedInboxesException.indexOf(sharedInbox) === -1) + return result.data.filter(sharedInbox => sharedInboxesException.includes(sharedInbox) === false) } -async function computeUris (toActors: ActorModel[], actorsException: ActorModel[] = []) { +async function computeUris (toActors: MActor[], actorsException: MActorWithInboxes[] = []) { const serverActor = await getServerActor() const targetUrls = toActors .filter(a => a.id !== serverActor.id) // Don't send to ourselves - .map(a => a.sharedInboxUrl || a.inboxUrl) + .map(a => a.getSharedInbox()) const toActorSharedInboxesSet = new Set(targetUrls) const sharedInboxesException = await buildSharedInboxesException(actorsException) return Array.from(toActorSharedInboxesSet) - .filter(sharedInbox => sharedInboxesException.indexOf(sharedInbox) === -1) + .filter(sharedInbox => sharedInboxesException.includes(sharedInbox) === false) } -async function buildSharedInboxesException (actorsException: ActorModel[]) { +async function buildSharedInboxesException (actorsException: MActorWithInboxes[]) { const serverActor = await getServerActor() return actorsException - .map(f => f.sharedInboxUrl || f.inboxUrl) + .map(f => f.getSharedInbox()) .concat([ serverActor.sharedInboxUrl ]) }