X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=server%2Flib%2Fjobs%2Factivitypub-http-job-scheduler%2Factivitypub-http-job-scheduler.ts;h=88885cf9723cfa3d196cfb3f5a6a22da4ac02ffa;hb=e12a009254de33bcdbd8334992980fa029c3e10d;hp=aef217ce71c0df6766164142ebe69a4b5c89784d;hpb=c986175d68a18e96fbd41537a05c7796a2c64f38;p=oweals%2Fpeertube.git diff --git a/server/lib/jobs/activitypub-http-job-scheduler/activitypub-http-job-scheduler.ts b/server/lib/jobs/activitypub-http-job-scheduler/activitypub-http-job-scheduler.ts index aef217ce7..88885cf97 100644 --- a/server/lib/jobs/activitypub-http-job-scheduler/activitypub-http-job-scheduler.ts +++ b/server/lib/jobs/activitypub-http-job-scheduler/activitypub-http-job-scheduler.ts @@ -1,15 +1,20 @@ -import { JobScheduler, JobHandler } from '../job-scheduler' +import { JobCategory } from '../../../../shared' +import { buildSignedActivity, getServerActor, logger } from '../../../helpers' +import { ACTIVITY_PUB } from '../../../initializers' +import { ActorModel } from '../../../models/activitypub/actor' +import { JobHandler, JobScheduler } from '../job-scheduler' import * as activitypubHttpBroadcastHandler from './activitypub-http-broadcast-handler' -import * as activitypubHttpUnicastHandler from './activitypub-http-unicast-handler' import * as activitypubHttpFetcherHandler from './activitypub-http-fetcher-handler' -import { JobCategory } from '../../../../shared' +import * as activitypubHttpUnicastHandler from './activitypub-http-unicast-handler' type ActivityPubHttpPayload = { uris: string[] - signatureAccountId?: number + signatureActorId?: number body?: any + attemptNumber?: number } + const jobHandlers: { [ handlerName: string ]: JobHandler } = { activitypubHttpBroadcastHandler, activitypubHttpUnicastHandler, @@ -19,7 +24,58 @@ const jobCategory: JobCategory = 'activitypub-http' const activitypubHttpJobScheduler = new JobScheduler(jobCategory, jobHandlers) +function maybeRetryRequestLater (err: Error, payload: ActivityPubHttpPayload, uri: string) { + logger.warn('Cannot make request to %s.', uri, err) + + let attemptNumber = payload.attemptNumber || 1 + attemptNumber += 1 + + if (attemptNumber < ACTIVITY_PUB.MAX_HTTP_ATTEMPT) { + logger.debug('Retrying request to %s (attempt %d/%d).', uri, attemptNumber, ACTIVITY_PUB.MAX_HTTP_ATTEMPT, err) + + const newPayload = Object.assign(payload, { + uris: [ uri ], + attemptNumber + }) + return activitypubHttpJobScheduler.createJob(undefined, 'activitypubHttpUnicastHandler', newPayload) + } +} + +async function computeBody (payload: ActivityPubHttpPayload) { + let body = payload.body + + if (payload.signatureActorId) { + const actorSignature = await ActorModel.load(payload.signatureActorId) + if (!actorSignature) throw new Error('Unknown signature actor id.') + body = await buildSignedActivity(actorSignature, payload.body) + } + + return body +} + +async function buildSignedRequestOptions (payload: ActivityPubHttpPayload) { + let actor: ActorModel + if (payload.signatureActorId) { + actor = await ActorModel.load(payload.signatureActorId) + if (!actor) throw new Error('Unknown signature actor id.') + } else { + // We need to sign the request, so use the server + actor = await getServerActor() + } + + const keyId = actor.getWebfingerUrl() + return { + algorithm: 'rsa-sha256', + authorizationHeaderName: 'Signature', + keyId, + key: actor.privateKey + } +} + export { ActivityPubHttpPayload, - activitypubHttpJobScheduler + activitypubHttpJobScheduler, + maybeRetryRequestLater, + computeBody, + buildSignedRequestOptions }