]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blobdiff - server/lib/activitypub/send/utils.ts
Merge branch 'release/3.1.0' into develop
[github/Chocobozzz/PeerTube.git] / server / lib / activitypub / send / utils.ts
index 77b7234796b6c89c55d444ffebb7cb649bd4055c..85a9f009d9af7c2d217b1d81ae4a8ed6bb7c5f66 100644 (file)
@@ -5,26 +5,30 @@ import { ActorModel } from '../../../models/activitypub/actor'
 import { ActorFollowModel } from '../../../models/activitypub/actor-follow'
 import { JobQueue } from '../../job-queue'
 import { getActorsInvolvedInVideo, getAudienceFromFollowersOf, getRemoteVideoAudience } from '../audience'
-import { getServerActor } from '../../../helpers/utils'
 import { afterCommitIfTransaction } from '../../../helpers/database-utils'
-import { MActorWithInboxes, MActor, MActorId, MActorLight, MVideo, MVideoAccountLight } from '../../../typings/models'
+import { MActor, MActorId, MActorLight, MActorWithInboxes, MVideoAccountLight, MVideoId, MVideoImmutable } from '../../../types/models'
+import { getServerActor } from '@server/models/application/application'
+import { ContextType } from '@shared/models/activitypub/context'
 
 async function sendVideoRelatedActivity (activityBuilder: (audience: ActivityAudience) => Activity, options: {
-  byActor: MActorLight,
-  video: MVideoAccountLight,
+  byActor: MActorLight
+  video: MVideoImmutable | MVideoAccountLight
   transaction?: Transaction
+  contextType?: ContextType
 }) {
-  const { byActor, video, transaction } = options
+  const { byActor, video, transaction, contextType } = options
 
   const actorsInvolvedInVideo = await getActorsInvolvedInVideo(video, transaction)
 
   // Send to origin
   if (video.isOwned() === false) {
-    const audience = getRemoteVideoAudience(video, actorsInvolvedInVideo)
+    const accountActor = (video as MVideoAccountLight).VideoChannel?.Account?.Actor || await ActorModel.loadAccountActorByVideoId(video.id)
+
+    const audience = getRemoteVideoAudience(accountActor, actorsInvolvedInVideo)
     const activity = activityBuilder(audience)
 
     return afterCommitIfTransaction(transaction, () => {
-      return unicastTo(activity, byActor, video.VideoChannel.Account.Actor.getSharedInbox())
+      return unicastTo(activity, byActor, accountActor.getSharedInbox(), contextType)
     })
   }
 
@@ -34,14 +38,14 @@ async function sendVideoRelatedActivity (activityBuilder: (audience: ActivityAud
 
   const actorsException = [ byActor ]
 
-  return broadcastToFollowers(activity, byActor, actorsInvolvedInVideo, transaction, actorsException)
+  return broadcastToFollowers(activity, byActor, actorsInvolvedInVideo, transaction, actorsException, contextType)
 }
 
 async function forwardVideoRelatedActivity (
   activity: Activity,
   t: Transaction,
-  followersException: MActorWithInboxes[] = [],
-  video: MVideo
+  followersException: MActorWithInboxes[],
+  video: MVideoId
 ) {
   // Mastodon does not add our announces in audience, so we forward to them manually
   const additionalActors = await getActorsInvolvedInVideo(video, t)
@@ -90,11 +94,12 @@ async function broadcastToFollowers (
   byActor: MActorId,
   toFollowersOf: MActorId[],
   t: Transaction,
-  actorsException: MActorWithInboxes[] = []
+  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 (
@@ -102,13 +107,14 @@ async function broadcastToActors (
   byActor: MActorId,
   toActors: MActor[],
   t?: Transaction,
-  actorsException: MActorWithInboxes[] = []
+  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: MActorId) {
+function broadcastTo (uris: string[], data: any, byActor: MActorId, contextType?: ContextType) {
   if (uris.length === 0) return undefined
 
   logger.debug('Creating broadcast job.', { uris })
@@ -116,19 +122,21 @@ function broadcastTo (uris: string[], data: any, byActor: MActorId) {
   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: MActorId, 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 })
@@ -153,7 +161,7 @@ async function computeFollowerUris (toFollowersOf: MActorId[], actorsException:
   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: MActor[], actorsException: MActorWithInboxes[] = []) {
@@ -166,7 +174,7 @@ async function computeUris (toActors: MActor[], actorsException: MActorWithInbox
 
   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: MActorWithInboxes[]) {