diff options
Diffstat (limited to 'server/lib/activitypub/send/misc.ts')
-rw-r--r-- | server/lib/activitypub/send/misc.ts | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/server/lib/activitypub/send/misc.ts b/server/lib/activitypub/send/misc.ts new file mode 100644 index 000000000..bea955b67 --- /dev/null +++ b/server/lib/activitypub/send/misc.ts | |||
@@ -0,0 +1,58 @@ | |||
1 | import { Transaction } from 'sequelize' | ||
2 | import { logger } from '../../../helpers/logger' | ||
3 | import { ACTIVITY_PUB, database as db } from '../../../initializers' | ||
4 | import { AccountInstance } from '../../../models/account/account-interface' | ||
5 | import { activitypubHttpJobScheduler } from '../../jobs/activitypub-http-job-scheduler/activitypub-http-job-scheduler' | ||
6 | |||
7 | async function broadcastToFollowers (data: any, byAccount: AccountInstance, toAccountFollowers: AccountInstance[], t: Transaction) { | ||
8 | const toAccountFollowerIds = toAccountFollowers.map(a => a.id) | ||
9 | const result = await db.AccountFollow.listAcceptedFollowerSharedInboxUrls(toAccountFollowerIds) | ||
10 | if (result.data.length === 0) { | ||
11 | logger.info('Not broadcast because of 0 followers for %s.', toAccountFollowerIds.join(', ')) | ||
12 | return undefined | ||
13 | } | ||
14 | |||
15 | const jobPayload = { | ||
16 | uris: result.data, | ||
17 | signatureAccountId: byAccount.id, | ||
18 | body: data | ||
19 | } | ||
20 | |||
21 | return activitypubHttpJobScheduler.createJob(t, 'activitypubHttpBroadcastHandler', jobPayload) | ||
22 | } | ||
23 | |||
24 | async function unicastTo (data: any, byAccount: AccountInstance, toAccountUrl: string, t: Transaction) { | ||
25 | const jobPayload = { | ||
26 | uris: [ toAccountUrl ], | ||
27 | signatureAccountId: byAccount.id, | ||
28 | body: data | ||
29 | } | ||
30 | |||
31 | return activitypubHttpJobScheduler.createJob(t, 'activitypubHttpUnicastHandler', jobPayload) | ||
32 | } | ||
33 | |||
34 | async function getAudience (accountSender: AccountInstance, isPublic = true) { | ||
35 | const followerInboxUrls = await accountSender.getFollowerSharedInboxUrls() | ||
36 | |||
37 | // Thanks Mastodon: https://github.com/tootsuite/mastodon/blob/master/app/lib/activitypub/tag_manager.rb#L47 | ||
38 | let to = [] | ||
39 | let cc = [] | ||
40 | |||
41 | if (isPublic) { | ||
42 | to = [ ACTIVITY_PUB.PUBLIC ] | ||
43 | cc = followerInboxUrls | ||
44 | } else { // Unlisted | ||
45 | to = followerInboxUrls | ||
46 | cc = [ ACTIVITY_PUB.PUBLIC ] | ||
47 | } | ||
48 | |||
49 | return { to, cc } | ||
50 | } | ||
51 | |||
52 | // --------------------------------------------------------------------------- | ||
53 | |||
54 | export { | ||
55 | broadcastToFollowers, | ||
56 | unicastTo, | ||
57 | getAudience | ||
58 | } | ||