import { map } from 'bluebird' ; import { Job } from 'bull' ; import { ActorFollowHealthCache } from '@server/lib/actor-follow-health-cache' ; import { ActivitypubHttpBroadcastPayload } from '@shared/models' ; import { logger } from '../../../helpers/logger' ; import { doRequest } from '../../../helpers/requests' ; import { BROADCAST_CONCURRENCY } from '../../../initializers/constants' ; import { buildGlobalHeaders , buildSignedRequestOptions , computeBody } from './utils/activitypub-http-utils' ; async function processActivityPubHttpBroadcast ( job ) { logger . info ( 'Processing ActivityPub broadcast in job %d.' , job . id ) ; const payload = job . data as ActivitypubHttpBroadcastPayload ; const body = await computeBody ( payload ) ; const httpSignatureOptions = await buildSignedRequestOptions ( payload ) ; const options = { method : 'POST' as 'POST' , json : body , httpSignature : httpSignatureOptions , headers : buildGlobalHeaders ( body ) } ; const badUrls = [ ] ; const goodUrls = [ ] ; await map ( payload . uris , async ( uri ) => { try { await doRequest ( uri , options ) ; goodUrls . push ( uri ) ; } catch ( err ) { logger . debug ( 'HTTP broadcast to %s failed.' , uri , { err } ) ; badUrls . push ( uri ) ; } } , { concurrency : BROADCAST_CONCURRENCY } ) ; return ActorFollowHealthCache . Instance . updateActorFollowsHealth ( goodUrls , badUrls ) ; } export { processActivityPubHttpBroadcast } ;