{"version":3,"file":"assets.mjs","sources":["../../../../src/strapi/providers/local-source/assets.ts"],"sourcesContent":["import { join } from 'path';\nimport { Duplex, PassThrough, Readable } from 'stream';\nimport { stat, createReadStream, ReadStream } from 'fs-extra';\nimport * as webStream from 'stream/web';\nimport type { Core } from '@strapi/types';\n\nimport type { IAsset, IFile } from '../../../../types';\n\nfunction getFileStream(\n filepath: string,\n strapi: Core.Strapi,\n isLocal = false\n): PassThrough | ReadStream {\n if (isLocal) {\n // Todo: handle errors\n return createReadStream(filepath);\n }\n\n const readableStream = new PassThrough();\n\n // fetch the image from remote url and stream it\n strapi\n .fetch(filepath)\n .then((res: Response) => {\n if (res.status !== 200) {\n readableStream.emit('error', new Error(`Request failed with status code ${res.status}`));\n return;\n }\n\n if (res.body) {\n // pipe the image data\n Readable.fromWeb(res.body as webStream.ReadableStream).pipe(readableStream);\n } else {\n readableStream.emit('error', new Error('Empty data found for file'));\n }\n })\n .catch((error: unknown) => {\n readableStream.emit('error', error);\n });\n\n return readableStream;\n}\n\nfunction getFileStats(\n filepath: string,\n strapi: Core.Strapi,\n isLocal = false\n): Promise<{ size: number }> {\n if (isLocal) {\n return stat(filepath);\n }\n return new Promise((resolve, reject) => {\n strapi\n .fetch(filepath)\n .then((res: Response) => {\n if (res.status !== 200) {\n reject(new Error(`Request failed with status code ${res.status}`));\n return;\n }\n\n const contentLength = res.headers.get('content-length');\n const stats = {\n size: contentLength ? parseInt(contentLength, 10) : 0,\n };\n\n resolve(stats);\n })\n .catch((error: unknown) => {\n reject(error);\n });\n });\n}\n\nasync function signFile(file: IFile) {\n const { provider } = strapi.plugins.upload;\n const { provider: providerName } = strapi.config.get('plugin.upload') as { provider: string };\n const isPrivate = await provider.isPrivate();\n if (file?.provider === providerName && isPrivate) {\n const signUrl = async (file: IFile) => {\n const signedUrl = await provider.getSignedUrl(file);\n file.url = signedUrl.url;\n };\n\n // Sign the original file\n await signUrl(file);\n // Sign each file format\n if (file.formats) {\n for (const format of Object.keys(file.formats)) {\n await signUrl(file.formats[format]);\n }\n }\n }\n}\n\n/**\n * Generate and consume assets streams in order to stream each file individually\n */\nexport const createAssetsStream = (strapi: Core.Strapi): Duplex => {\n const generator: () => AsyncGenerator = async function* () {\n const stream: Readable = strapi.db\n .queryBuilder('plugin::upload.file')\n // Create a query builder instance (default type is 'select')\n // Fetch all columns\n .select('*')\n // Get a readable stream\n .stream();\n\n for await (const file of stream) {\n const isLocalProvider = file.provider === 'local';\n if (!isLocalProvider) {\n await signFile(file);\n }\n const filepath = isLocalProvider ? join(strapi.dirs.static.public, file.url) : file.url;\n const stats = await getFileStats(filepath, strapi, isLocalProvider);\n const stream = getFileStream(filepath, strapi, isLocalProvider);\n\n yield {\n metadata: file,\n filepath,\n filename: file.hash + file.ext,\n stream,\n stats: { size: stats.size },\n };\n\n if (file.formats) {\n for (const format of Object.keys(file.formats)) {\n const fileFormat = file.formats[format];\n const fileFormatFilepath = isLocalProvider\n ? join(strapi.dirs.static.public, fileFormat.url)\n : fileFormat.url;\n const fileFormatStats = await getFileStats(fileFormatFilepath, strapi, isLocalProvider);\n const fileFormatStream = getFileStream(fileFormatFilepath, strapi, isLocalProvider);\n const metadata = { ...fileFormat, type: format, id: file.id, mainHash: file.hash };\n yield {\n metadata,\n filepath: fileFormatFilepath,\n filename: fileFormat.hash + fileFormat.ext,\n stream: fileFormatStream,\n stats: { size: fileFormatStats.size },\n };\n }\n }\n }\n };\n\n return Duplex.from(generator());\n};\n"],"names":["getFileStream","filepath","strapi","isLocal","createReadStream","readableStream","PassThrough","fetch","then","res","status","emit","Error","body","Readable","fromWeb","pipe","catch","error","getFileStats","stat","Promise","resolve","reject","contentLength","headers","get","stats","size","parseInt","signFile","file","provider","plugins","upload","providerName","config","isPrivate","signUrl","signedUrl","getSignedUrl","url","formats","format","Object","keys","createAssetsStream","generator","stream","db","queryBuilder","select","isLocalProvider","join","dirs","static","public","metadata","filename","hash","ext","fileFormat","fileFormatFilepath","fileFormatStats","fileFormatStream","type","id","mainHash","Duplex","from"],"mappings":"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"}