X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Flib%2Flocal-actor.ts;h=8c10ed700fd4e4f311341fd49f99e929aa7c7f51;hb=e901579b00fbcd8fc0f7b45fd841636329148a34;hp=01046d0179324853833a96e1188ed63792d9ff1b;hpb=ab4b8974997777373a6032073f9c1aaf33ba9931;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/lib/local-actor.ts b/server/lib/local-actor.ts index 01046d017..8c10ed700 100644 --- a/server/lib/local-actor.ts +++ b/server/lib/local-actor.ts @@ -1,20 +1,19 @@ -import { queue } from 'async' import { remove } from 'fs-extra' import LRUCache from 'lru-cache' import { join } from 'path' +import { Transaction } from 'sequelize/types' import { ActorModel } from '@server/models/actor/actor' import { getLowercaseExtension } from '@shared/core-utils' import { buildUUID } from '@shared/extra-utils' import { ActivityPubActorType, ActorImageType } from '@shared/models' import { retryTransactionWrapper } from '../helpers/database-utils' -import { processImage } from '../helpers/image-utils' -import { downloadImage } from '../helpers/requests' import { CONFIG } from '../initializers/config' -import { ACTOR_IMAGES_SIZE, LRU_CACHE, QUEUE_CONCURRENCY, WEBSERVER } from '../initializers/constants' +import { ACTOR_IMAGES_SIZE, LRU_CACHE, WEBSERVER } from '../initializers/constants' import { sequelizeTypescript } from '../initializers/database' import { MAccountDefault, MActor, MChannelDefault } from '../types/models' import { deleteActorImages, updateActorImages } from './activitypub/actors' import { sendUpdateActor } from './activitypub/send' +import { downloadImageFromWorker, processImageFromWorker } from './worker/parent-process' function buildActorInstance (type: ActivityPubActorType, url: string, preferredUsername: string) { return new ActorModel({ @@ -43,7 +42,7 @@ async function updateLocalActorImageFiles ( const imageName = buildUUID() + extension const destination = join(CONFIG.STORAGE.ACTOR_IMAGES, imageName) - await processImage(imagePhysicalFile.path, destination, imageSize, true) + await processImageFromWorker({ path: imagePhysicalFile.path, destination, newSize: imageSize, keepOriginal: true }) return { imageName, @@ -87,27 +86,38 @@ async function deleteLocalActorImageFile (accountOrChannel: MAccountDefault | MC }) } -type DownloadImageQueueTask = { +// --------------------------------------------------------------------------- + +async function findAvailableLocalActorName (baseActorName: string, transaction?: Transaction) { + let actor = await ActorModel.loadLocalByName(baseActorName, transaction) + if (!actor) return baseActorName + + for (let i = 1; i < 30; i++) { + const name = `${baseActorName}-${i}` + + actor = await ActorModel.loadLocalByName(name, transaction) + if (!actor) return name + } + + throw new Error('Cannot find available actor local name (too much iterations).') +} + +// --------------------------------------------------------------------------- + +function downloadActorImageFromWorker (options: { fileUrl: string filename: string type: ActorImageType size: typeof ACTOR_IMAGES_SIZE[ActorImageType][0] -} - -const downloadImageQueue = queue((task, cb) => { - downloadImage(task.fileUrl, CONFIG.STORAGE.ACTOR_IMAGES, task.filename, task.size) - .then(() => cb()) - .catch(err => cb(err)) -}, QUEUE_CONCURRENCY.ACTOR_PROCESS_IMAGE) - -function pushActorImageProcessInQueue (task: DownloadImageQueueTask) { - return new Promise((res, rej) => { - downloadImageQueue.push(task, err => { - if (err) return rej(err) +}) { + const downloaderOptions = { + url: options.fileUrl, + destDir: CONFIG.STORAGE.ACTOR_IMAGES, + destName: options.filename, + size: options.size + } - return res() - }) - }) + return downloadImageFromWorker(downloaderOptions) } // Unsafe so could returns paths that does not exist anymore @@ -116,7 +126,9 @@ const actorImagePathUnsafeCache = new LRUCache({ max: LRU_CACHE. export { actorImagePathUnsafeCache, updateLocalActorImageFiles, + findAvailableLocalActorName, + downloadActorImageFromWorker, deleteLocalActorImageFile, - pushActorImageProcessInQueue, + downloadImageFromWorker, buildActorInstance }