{"version":3,"file":"assets-destination-writable.mjs","sources":["../../../../src/strapi/providers/local-destination/assets-destination-writable.ts"],"sourcesContent":["import { Writable, Readable } from 'stream';\nimport type { Core } from '@strapi/types';\n\nimport type { IAsset, IFile } from '../../../../types';\nimport type { Transaction } from '../../../../types/utils';\n\nexport interface CreateAssetsDestinationWritableOptions {\n  strapi: Core.Strapi;\n  transaction: Transaction;\n  resolveUploadFileId: (metadata: { id: number }) => number | undefined;\n  restoreMediaEntitiesContent: boolean;\n  removeAssetsBackup: () => Promise<void>;\n}\n\n/**\n * Writable for restoring upload assets during a local push destination transfer.\n *\n * The Writable `write()` callback must return as soon as the chunk is accepted — **before**\n * `uploadStream` finishes — so the remote push handler can feed PassThrough data in the same\n * WebSocket batch after an asset `start` row (see `streamAsset` in remote `push` handler).\n */\nexport function createAssetsDestinationWritable(\n  options: CreateAssetsDestinationWritableOptions\n): Writable {\n  const {\n    strapi,\n    transaction,\n    resolveUploadFileId,\n    restoreMediaEntitiesContent,\n    removeAssetsBackup,\n  } = options;\n\n  let pendingUploads = 0;\n\n  return new Writable({\n    objectMode: true,\n    async final(next) {\n      while (pendingUploads > 0) {\n        await new Promise<void>((resolve) => {\n          setImmediate(resolve);\n        });\n      }\n      await removeAssetsBackup();\n      next();\n    },\n    write(chunk: IAsset, _encoding, callback) {\n      const uploadData = {\n        ...chunk.metadata,\n        stream: Readable.from(chunk.stream),\n        buffer: chunk?.buffer,\n      };\n\n      const provider = strapi.config.get<{ provider: string }>('plugin::upload').provider;\n\n      const fileId = resolveUploadFileId(uploadData);\n      if (!fileId) {\n        callback(new Error(`File ID not found for ID: ${uploadData.id}`));\n        return;\n      }\n\n      if (!transaction) {\n        callback(new Error('Transaction not available for asset upload'));\n        return;\n      }\n\n      pendingUploads += 1;\n      transaction\n        .attach(async () => {\n          try {\n            await strapi.plugin('upload').provider.uploadStream(uploadData);\n\n            if (!restoreMediaEntitiesContent) {\n              return;\n            }\n\n            if (uploadData?.type) {\n              const entry: IFile = await strapi.db.query('plugin::upload.file').findOne({\n                where: { id: fileId },\n              });\n              if (!entry) {\n                throw new Error('file not found');\n              }\n              const specificFormat = entry?.formats?.[uploadData.type];\n              if (specificFormat) {\n                specificFormat.url = uploadData.url;\n              }\n              await strapi.db.query('plugin::upload.file').update({\n                where: { id: entry.id },\n                data: {\n                  formats: entry.formats,\n                  provider,\n                },\n              });\n              return;\n            }\n\n            const entry: IFile = await strapi.db.query('plugin::upload.file').findOne({\n              where: { id: fileId },\n            });\n            if (!entry) {\n              throw new Error('file not found');\n            }\n            entry.url = uploadData.url;\n            await strapi.db.query('plugin::upload.file').update({\n              where: { id: entry.id },\n              data: {\n                url: entry.url,\n                provider,\n              },\n            });\n          } catch (error) {\n            throw new Error(`Error while uploading asset ${chunk.filename} ${error}`);\n          }\n        })\n        .finally(() => {\n          pendingUploads -= 1;\n        })\n        .catch((error: unknown) => {\n          const err = error instanceof Error ? error : new Error(String(error));\n          process.nextTick(() => {\n            this.destroy(err);\n          });\n        });\n\n      callback();\n    },\n  });\n}\n"],"names":["createAssetsDestinationWritable","options","strapi","transaction","resolveUploadFileId","restoreMediaEntitiesContent","removeAssetsBackup","pendingUploads","Writable","objectMode","final","next","Promise","resolve","setImmediate","write","chunk","_encoding","callback","uploadData","metadata","stream","Readable","from","buffer","provider","config","get","fileId","Error","id","attach","plugin","uploadStream","type","entry","db","query","findOne","where","specificFormat","formats","url","update","data","error","filename","finally","catch","err","String","process","nextTick","destroy"],"mappings":"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"}