X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Flib%2Factivitypub%2Factors%2Frefresh.ts;h=6d8428d6627578f8e4155ce2b0aed421bbb73378;hb=0c302acb3c358b4d4d8dee45aed1de1108ea37ea;hp=9758649a563796d0f506289ae7af3357e7dc1a38;hpb=868fce62f86812759ccedccf7634236ac3701d9a;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/lib/activitypub/actors/refresh.ts b/server/lib/activitypub/actors/refresh.ts index 9758649a5..6d8428d66 100644 --- a/server/lib/activitypub/actors/refresh.ts +++ b/server/lib/activitypub/actors/refresh.ts @@ -1,30 +1,54 @@ -import { logger } from '@server/helpers/logger' +import { logger, loggerTagsFactory } from '@server/helpers/logger' +import { PromiseCache } from '@server/helpers/promise-cache' import { PeerTubeRequestError } from '@server/helpers/requests' import { ActorLoadByUrlType } from '@server/lib/model-loaders' import { ActorModel } from '@server/models/actor/actor' import { MActorAccountChannelId, MActorFull } from '@server/types/models' -import { HttpStatusCode } from '@shared/core-utils' +import { HttpStatusCode } from '@shared/models' import { fetchRemoteActor } from './shared' import { APActorUpdater } from './updater' import { getUrlFromWebfinger } from './webfinger' -async function refreshActorIfNeeded ( - actorArg: T, +type RefreshResult = Promise<{ actor: T | MActorFull, refreshed: boolean }> + +type RefreshOptions = { + actor: T fetchedType: ActorLoadByUrlType -): Promise<{ actor: T | MActorFull, refreshed: boolean }> { - if (!actorArg.isOutdated()) return { actor: actorArg, refreshed: false } +} + +const promiseCache = new PromiseCache(doRefresh, (options: RefreshOptions) => options.actor.url) + +function refreshActorIfNeeded (options: RefreshOptions): RefreshResult { + const actorArg = options.actor + if (!actorArg.isOutdated()) return Promise.resolve({ actor: actorArg, refreshed: false }) + + return promiseCache.run(options) +} + +export { + refreshActorIfNeeded +} + +// --------------------------------------------------------------------------- + +async function doRefresh (options: RefreshOptions): RefreshResult { + const { actor: actorArg, fetchedType } = options // We need more attributes const actor = fetchedType === 'all' ? actorArg as MActorFull : await ActorModel.loadByUrlAndPopulateAccountAndChannel(actorArg.url) + const lTags = loggerTagsFactory('ap', 'actor', 'refresh', actor.url) + + logger.info('Refreshing actor %s.', actor.url, lTags()) + try { const actorUrl = await getActorUrl(actor) const { actorObject } = await fetchRemoteActor(actorUrl) if (actorObject === undefined) { - logger.warn('Cannot fetch remote actor in refresh actor.') + logger.info('Cannot fetch remote actor %s in refresh actor.', actorUrl) return { actor, refreshed: false } } @@ -34,7 +58,7 @@ async function refreshActorIfNeeded { - logger.warn('Cannot get actor URL from webfinger, keeping the old one.', err) + logger.warn('Cannot get actor URL from webfinger, keeping the old one.', { err }) return actor.url }) }