import { StatsManager } from '@server/lib/stat-manager' ; import { Activity , ActivityType } from '../../../../shared/models/activitypub' ; import { checkUrlsSameHost , getAPId } from '../../../helpers/activitypub' ; import { logger } from '../../../helpers/logger' ; import { APProcessorOptions } from '../../../types/activitypub-processor.model' ; import { MActorDefault , MActorSignature } from '../../../types/models' ; import { getOrCreateAPActor } from '../actors' ; import { processAcceptActivity } from './process-accept' ; import { processAnnounceActivity } from './process-announce' ; import { processCreateActivity } from './process-create' ; import { processDeleteActivity } from './process-delete' ; import { processDislikeActivity } from './process-dislike' ; import { processFlagActivity } from './process-flag' ; import { processFollowActivity } from './process-follow' ; import { processLikeActivity } from './process-like' ; import { processRejectActivity } from './process-reject' ; import { processUndoActivity } from './process-undo' ; import { processUpdateActivity } from './process-update' ; import { processViewActivity } from './process-view' ; const processActivity = { Create : processCreateActivity , Update : processUpdateActivity , Delete : processDeleteActivity , Follow : processFollowActivity , Accept : processAcceptActivity , Reject : processRejectActivity , Announce : processAnnounceActivity , Undo : processUndoActivity , Like : processLikeActivity , Dislike : processDislikeActivity , Flag : processFlagActivity , View : processViewActivity } ; async function processActivities ( activities , options = { } ) { const { outboxUrl , signatureActor , inboxActor , fromFetch = false } = options ; const actorsCache = { } ; for ( const activity of activities ) { if ( ! signatureActor && [ 'Create' , 'Announce' , 'Like' ] . includes ( activity . type ) === false ) { logger . error ( 'Cannot process activity %s (type: %s) without the actor signature.' , activity . id , activity . type ) ; continue ; } const actorUrl = getAPId ( activity . actor ) ; if ( signatureActor && actorUrl !== signatureActor . url ) { logger . warn ( 'Signature mismatch between %s and %s, skipping.' , actorUrl , signatureActor . url ) ; continue ; } if ( outboxUrl && checkUrlsSameHost ( outboxUrl , actorUrl ) !== true ) { logger . warn ( 'Host mismatch between outbox URL %s and actor URL %s, skipping.' , outboxUrl , actorUrl ) ; continue ; } const byActor = signatureActor || actorsCache [ actorUrl ] || await getOrCreateAPActor ( actorUrl ) ; actorsCache [ actorUrl ] = byActor ; const activityProcessor = processActivity [ activity . type ] ; if ( activityProcessor === undefined ) { logger . warn ( 'Unknown activity type %s.' , activity . type , { activityId : activity . id } ) ; continue ; } try { await activityProcessor ( { activity , byActor , inboxActor , fromFetch } ) ; StatsManager . Instance . addInboxProcessedSuccess ( activity . type ) ; } catch ( err ) { logger . warn ( 'Cannot process activity %s.' , activity . type , { err } ) ; StatsManager . Instance . addInboxProcessedError ( activity . type ) ; } } } export { processActivities } ;