{"version":3,"file":"estimate-asset-totals.mjs","sources":["../../../../src/strapi/providers/local-source/estimate-asset-totals.ts"],"sourcesContent":["import { join } from 'path';\nimport type { Readable } from 'stream';\nimport type { Core } from '@strapi/types';\n\nimport type { IAsset, StageTotalsEstimate } from '../../../../types';\n\nimport { getFileStatsForTransfer, signUploadFileForTransfer } from './assets';\n\ntype UploadFileRecord = IAsset['metadata'];\n\n/** Strapi stores byte size on each file record; use for remote totals to avoid per-URL HTTP. */\nfunction hasReliableDbSize(size: unknown): size is number {\n  return typeof size === 'number' && Number.isFinite(size) && size >= 0;\n}\n\n/** When every main + format has a DB size, remote rows need no signing or HTTP stat. */\nfunction remoteRowCanUseDbOnly(file: UploadFileRecord): boolean {\n  if (!hasReliableDbSize(file.size)) {\n    return false;\n  }\n  if (!file.formats) {\n    return true;\n  }\n  for (const key of Object.keys(file.formats)) {\n    if (!hasReliableDbSize(file.formats[key].size)) {\n      return false;\n    }\n  }\n  return true;\n}\n\n/**\n * Sum sizes and counts for the same asset rows `createAssetsStream` would yield (main + formats),\n * skipping missing files with ENOENT like the stream does. Used for transfer progress totals / ETA.\n *\n * - **Local (`provider === 'local'`):** `stat` on disk (source of truth; matches ENOENT skips).\n * - **Remote:** sum `size` from DB when present on main and every format; otherwise sign + `fetch` / `Content-Length` like before.\n */\nexport async function estimateAssetTotals(strapi: Core.Strapi): Promise<StageTotalsEstimate> {\n  let totalBytes = 0;\n  let totalCount = 0;\n\n  const stream: Readable = strapi.db.queryBuilder('plugin::upload.file').select('*').stream();\n\n  for await (const file of stream) {\n    const isLocalProvider = file.provider === 'local';\n\n    if (isLocalProvider) {\n      const filepath = join(strapi.dirs.static.public, file.url);\n      try {\n        const stats = await getFileStatsForTransfer(filepath, strapi, true);\n        totalBytes += stats.size;\n        totalCount += 1;\n      } catch (err: unknown) {\n        const code =\n          err && typeof err === 'object' && 'code' in err\n            ? (err as NodeJS.ErrnoException).code\n            : undefined;\n        if (code === 'ENOENT') {\n          strapi.log.warn(`[Data transfer] Skipping missing asset file: ${filepath}`);\n          continue;\n        }\n        throw err;\n      }\n\n      if (file.formats) {\n        for (const format of Object.keys(file.formats)) {\n          const fileFormat = file.formats[format];\n          const fileFormatFilepath = join(strapi.dirs.static.public, fileFormat.url);\n          try {\n            const fileFormatStats = await getFileStatsForTransfer(fileFormatFilepath, strapi, true);\n            totalBytes += fileFormatStats.size;\n            totalCount += 1;\n          } catch (err: unknown) {\n            const code =\n              err && typeof err === 'object' && 'code' in err\n                ? (err as NodeJS.ErrnoException).code\n                : undefined;\n            if (code === 'ENOENT') {\n              strapi.log.warn(`[Data transfer] Skipping missing asset file: ${fileFormatFilepath}`);\n              continue;\n            }\n            throw err;\n          }\n        }\n      }\n\n      continue;\n    }\n\n    // Remote: prefer DB sizes (fast); fall back to signed URL + HTTP where `size` is missing.\n    if (remoteRowCanUseDbOnly(file)) {\n      totalBytes += file.size;\n      totalCount += 1;\n      if (file.formats) {\n        for (const format of Object.keys(file.formats)) {\n          totalBytes += file.formats[format].size;\n          totalCount += 1;\n        }\n      }\n      continue;\n    }\n\n    await signUploadFileForTransfer(strapi, file);\n\n    if (hasReliableDbSize(file.size)) {\n      totalBytes += file.size;\n      totalCount += 1;\n    } else {\n      try {\n        const stats = await getFileStatsForTransfer(file.url, strapi, false);\n        totalBytes += stats.size;\n        totalCount += 1;\n      } catch (err: unknown) {\n        const code =\n          err && typeof err === 'object' && 'code' in err\n            ? (err as NodeJS.ErrnoException).code\n            : undefined;\n        if (code === 'ENOENT') {\n          strapi.log.warn(`[Data transfer] Skipping missing asset file: ${file.url}`);\n          continue;\n        }\n        throw err;\n      }\n    }\n\n    if (file.formats) {\n      for (const format of Object.keys(file.formats)) {\n        const fileFormat = file.formats[format];\n        const fileFormatFilepath = fileFormat.url;\n\n        if (hasReliableDbSize(fileFormat.size)) {\n          totalBytes += fileFormat.size;\n          totalCount += 1;\n        } else {\n          try {\n            const fileFormatStats = await getFileStatsForTransfer(\n              fileFormatFilepath,\n              strapi,\n              false\n            );\n            totalBytes += fileFormatStats.size;\n            totalCount += 1;\n          } catch (err: unknown) {\n            const code =\n              err && typeof err === 'object' && 'code' in err\n                ? (err as NodeJS.ErrnoException).code\n                : undefined;\n            if (code === 'ENOENT') {\n              strapi.log.warn(`[Data transfer] Skipping missing asset file: ${fileFormatFilepath}`);\n              continue;\n            }\n            throw err;\n          }\n        }\n      }\n    }\n  }\n\n  return { totalBytes, totalCount };\n}\n"],"names":["hasReliableDbSize","size","Number","isFinite","remoteRowCanUseDbOnly","file","formats","key","Object","keys","estimateAssetTotals","strapi","totalBytes","totalCount","stream","db","queryBuilder","select","isLocalProvider","provider","filepath","join","dirs","static","public","url","stats","getFileStatsForTransfer","err","code","undefined","log","warn","format","fileFormat","fileFormatFilepath","fileFormatStats","signUploadFileForTransfer"],"mappings":"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"}