diff options
author | Chocobozzz <florian.bigard@gmail.com> | 2017-11-22 16:25:03 +0100 |
---|---|---|
committer | Chocobozzz <florian.bigard@gmail.com> | 2017-11-27 19:40:53 +0100 |
commit | 40ff57078e15d5b86ee6b71e198b95d3feb78eaf (patch) | |
tree | 88031d4eac6a26597e8a1f2fc63674664e3eae26 /server/lib/activitypub/send | |
parent | c46edbc2f6ca310b2f0331f979ac6caf27f6eb92 (diff) | |
download | PeerTube-40ff57078e15d5b86ee6b71e198b95d3feb78eaf.tar.gz PeerTube-40ff57078e15d5b86ee6b71e198b95d3feb78eaf.tar.zst PeerTube-40ff57078e15d5b86ee6b71e198b95d3feb78eaf.zip |
Federate video views
Diffstat (limited to 'server/lib/activitypub/send')
-rw-r--r-- | server/lib/activitypub/send/misc.ts | 14 | ||||
-rw-r--r-- | server/lib/activitypub/send/send-create.ts | 64 |
2 files changed, 68 insertions, 10 deletions
diff --git a/server/lib/activitypub/send/misc.ts b/server/lib/activitypub/send/misc.ts index bea955b67..f3dc5c148 100644 --- a/server/lib/activitypub/send/misc.ts +++ b/server/lib/activitypub/send/misc.ts | |||
@@ -4,16 +4,26 @@ import { ACTIVITY_PUB, database as db } from '../../../initializers' | |||
4 | import { AccountInstance } from '../../../models/account/account-interface' | 4 | import { AccountInstance } from '../../../models/account/account-interface' |
5 | import { activitypubHttpJobScheduler } from '../../jobs/activitypub-http-job-scheduler/activitypub-http-job-scheduler' | 5 | import { activitypubHttpJobScheduler } from '../../jobs/activitypub-http-job-scheduler/activitypub-http-job-scheduler' |
6 | 6 | ||
7 | async function broadcastToFollowers (data: any, byAccount: AccountInstance, toAccountFollowers: AccountInstance[], t: Transaction) { | 7 | async function broadcastToFollowers ( |
8 | data: any, | ||
9 | byAccount: AccountInstance, | ||
10 | toAccountFollowers: AccountInstance[], | ||
11 | t: Transaction, | ||
12 | followersException: AccountInstance[] = [] | ||
13 | ) { | ||
8 | const toAccountFollowerIds = toAccountFollowers.map(a => a.id) | 14 | const toAccountFollowerIds = toAccountFollowers.map(a => a.id) |
15 | |||
9 | const result = await db.AccountFollow.listAcceptedFollowerSharedInboxUrls(toAccountFollowerIds) | 16 | const result = await db.AccountFollow.listAcceptedFollowerSharedInboxUrls(toAccountFollowerIds) |
10 | if (result.data.length === 0) { | 17 | if (result.data.length === 0) { |
11 | logger.info('Not broadcast because of 0 followers for %s.', toAccountFollowerIds.join(', ')) | 18 | logger.info('Not broadcast because of 0 followers for %s.', toAccountFollowerIds.join(', ')) |
12 | return undefined | 19 | return undefined |
13 | } | 20 | } |
14 | 21 | ||
22 | const followersSharedInboxException = followersException.map(f => f.sharedInboxUrl) | ||
23 | const uris = result.data.filter(sharedInbox => followersSharedInboxException.indexOf(sharedInbox) === -1) | ||
24 | |||
15 | const jobPayload = { | 25 | const jobPayload = { |
16 | uris: result.data, | 26 | uris, |
17 | signatureAccountId: byAccount.id, | 27 | signatureAccountId: byAccount.id, |
18 | body: data | 28 | body: data |
19 | } | 29 | } |
diff --git a/server/lib/activitypub/send/send-create.ts b/server/lib/activitypub/send/send-create.ts index df8e0a642..e5fb212b7 100644 --- a/server/lib/activitypub/send/send-create.ts +++ b/server/lib/activitypub/send/send-create.ts | |||
@@ -3,7 +3,9 @@ import { ActivityCreate } from '../../../../shared/models/activitypub/activity' | |||
3 | import { AccountInstance, VideoChannelInstance, VideoInstance } from '../../../models' | 3 | import { AccountInstance, VideoChannelInstance, VideoInstance } from '../../../models' |
4 | import { VideoAbuseInstance } from '../../../models/video/video-abuse-interface' | 4 | import { VideoAbuseInstance } from '../../../models/video/video-abuse-interface' |
5 | import { broadcastToFollowers, getAudience, unicastTo } from './misc' | 5 | import { broadcastToFollowers, getAudience, unicastTo } from './misc' |
6 | import { getVideoAbuseActivityPubUrl } from '../url' | 6 | import { getVideoAbuseActivityPubUrl, getVideoViewActivityPubUrl } from '../url' |
7 | import { getServerAccount } from '../../../helpers/utils' | ||
8 | import { database as db } from '../../../initializers' | ||
7 | 9 | ||
8 | async function sendCreateVideoChannel (videoChannel: VideoChannelInstance, t: Transaction) { | 10 | async function sendCreateVideoChannel (videoChannel: VideoChannelInstance, t: Transaction) { |
9 | const byAccount = videoChannel.Account | 11 | const byAccount = videoChannel.Account |
@@ -16,21 +18,53 @@ async function sendCreateVideoChannel (videoChannel: VideoChannelInstance, t: Tr | |||
16 | 18 | ||
17 | async function sendVideoAbuse (byAccount: AccountInstance, videoAbuse: VideoAbuseInstance, video: VideoInstance, t: Transaction) { | 19 | async function sendVideoAbuse (byAccount: AccountInstance, videoAbuse: VideoAbuseInstance, video: VideoInstance, t: Transaction) { |
18 | const url = getVideoAbuseActivityPubUrl(videoAbuse) | 20 | const url = getVideoAbuseActivityPubUrl(videoAbuse) |
19 | const data = await createActivityData(url, byAccount, videoAbuse.toActivityPubObject()) | 21 | |
22 | const audience = { to: [ video.VideoChannel.Account.url ], cc: [] } | ||
23 | const data = await createActivityData(url, byAccount, videoAbuse.toActivityPubObject(), audience) | ||
24 | |||
25 | return unicastTo(data, byAccount, video.VideoChannel.Account.sharedInboxUrl, t) | ||
26 | } | ||
27 | |||
28 | async function sendCreateViewToOrigin (byAccount: AccountInstance, video: VideoInstance, t: Transaction) { | ||
29 | const url = getVideoViewActivityPubUrl(byAccount, video) | ||
30 | const viewActivity = createViewActivityData(byAccount, video) | ||
31 | |||
32 | const audience = { to: [ video.VideoChannel.Account.url ], cc: [ video.VideoChannel.Account.url + '/followers' ] } | ||
33 | const data = await createActivityData(url, byAccount, viewActivity, audience) | ||
20 | 34 | ||
21 | return unicastTo(data, byAccount, video.VideoChannel.Account.sharedInboxUrl, t) | 35 | return unicastTo(data, byAccount, video.VideoChannel.Account.sharedInboxUrl, t) |
22 | } | 36 | } |
23 | 37 | ||
24 | // async function sendCreateView () | 38 | async function sendCreateViewToVideoFollowers (byAccount: AccountInstance, video: VideoInstance, t: Transaction) { |
39 | const url = getVideoViewActivityPubUrl(byAccount, video) | ||
40 | const viewActivity = createViewActivityData(byAccount, video) | ||
41 | |||
42 | const audience = { to: [ video.VideoChannel.Account.url + '/followers' ], cc: [] } | ||
43 | const data = await createActivityData(url, byAccount, viewActivity, audience) | ||
44 | |||
45 | const serverAccount = await getServerAccount() | ||
46 | const accountsToForwardView = await db.VideoShare.loadAccountsByShare(video.id) | ||
47 | accountsToForwardView.push(video.VideoChannel.Account) | ||
48 | |||
49 | // Don't forward view to server that sent it to us | ||
50 | const index = accountsToForwardView.findIndex(a => a.id === byAccount.id) | ||
51 | if (index) accountsToForwardView.splice(index, 1) | ||
52 | |||
53 | const followersException = [ byAccount ] | ||
54 | return broadcastToFollowers(data, serverAccount, accountsToForwardView, t, followersException) | ||
55 | } | ||
56 | |||
57 | async function createActivityData (url: string, byAccount: AccountInstance, object: any, audience?: { to: string[], cc: string[] }) { | ||
58 | if (!audience) { | ||
59 | audience = await getAudience(byAccount) | ||
60 | } | ||
25 | 61 | ||
26 | async function createActivityData (url: string, byAccount: AccountInstance, object: any) { | ||
27 | const { to, cc } = await getAudience(byAccount) | ||
28 | const activity: ActivityCreate = { | 62 | const activity: ActivityCreate = { |
29 | type: 'Create', | 63 | type: 'Create', |
30 | id: url, | 64 | id: url, |
31 | actor: byAccount.url, | 65 | actor: byAccount.url, |
32 | to, | 66 | to: audience.to, |
33 | cc, | 67 | cc: audience.cc, |
34 | object | 68 | object |
35 | } | 69 | } |
36 | 70 | ||
@@ -42,5 +76,19 @@ async function createActivityData (url: string, byAccount: AccountInstance, obje | |||
42 | export { | 76 | export { |
43 | sendCreateVideoChannel, | 77 | sendCreateVideoChannel, |
44 | sendVideoAbuse, | 78 | sendVideoAbuse, |
45 | createActivityData | 79 | createActivityData, |
80 | sendCreateViewToOrigin, | ||
81 | sendCreateViewToVideoFollowers | ||
82 | } | ||
83 | |||
84 | // --------------------------------------------------------------------------- | ||
85 | |||
86 | function createViewActivityData (byAccount: AccountInstance, video: VideoInstance) { | ||
87 | const obj = { | ||
88 | type: 'View', | ||
89 | actor: byAccount.url, | ||
90 | object: video.url | ||
91 | } | ||
92 | |||
93 | return obj | ||
46 | } | 94 | } |