@strapi/data-transfer 5.58.0 → 5.60.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (26) hide show
  1. package/dist/directory/providers/destination/index.d.ts.map +1 -1
  2. package/dist/directory/providers/destination/index.js.map +1 -1
  3. package/dist/directory/providers/destination/index.mjs.map +1 -1
  4. package/dist/engine/index.d.ts.map +1 -1
  5. package/dist/engine/index.js.map +1 -1
  6. package/dist/engine/index.mjs.map +1 -1
  7. package/dist/file/providers/destination/index.d.ts.map +1 -1
  8. package/dist/file/providers/destination/index.js.map +1 -1
  9. package/dist/file/providers/destination/index.mjs.map +1 -1
  10. package/dist/strapi/providers/remote-destination/index.d.ts.map +1 -1
  11. package/dist/strapi/providers/remote-destination/index.js.map +1 -1
  12. package/dist/strapi/providers/remote-destination/index.mjs.map +1 -1
  13. package/dist/strapi/providers/remote-source/index.d.ts.map +1 -1
  14. package/dist/strapi/providers/remote-source/index.js.map +1 -1
  15. package/dist/strapi/providers/remote-source/index.mjs.map +1 -1
  16. package/dist/strapi/remote/flows/index.d.ts.map +1 -1
  17. package/dist/strapi/remote/flows/index.js.map +1 -1
  18. package/dist/strapi/remote/flows/index.mjs.map +1 -1
  19. package/dist/strapi/remote/handlers/pull.d.ts.map +1 -1
  20. package/dist/strapi/remote/handlers/push.d.ts.map +1 -1
  21. package/dist/strapi/remote/handlers/utils.js +1 -1
  22. package/dist/strapi/remote/handlers/utils.js.map +1 -1
  23. package/dist/strapi/remote/handlers/utils.mjs +2 -2
  24. package/dist/strapi/remote/handlers/utils.mjs.map +1 -1
  25. package/dist/types/remote/protocol/client/transfer/index.d.ts.map +1 -1
  26. package/package.json +8 -8
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../src/strapi/providers/remote-destination/index.ts"],"sourcesContent":["import { createHash, randomUUID } from 'crypto';\nimport { Writable } from 'stream';\nimport { WebSocket } from 'ws';\nimport { once } from 'lodash';\nimport type { Struct, Utils } from '@strapi/types';\n\nimport { createDispatcher, connectToWebsocket, trimTrailingSlash } from '../utils';\n\nimport type {\n IDestinationProvider,\n IMetadata,\n ProviderType,\n IAsset,\n TransferStage,\n Protocol,\n} from '../../../types';\nimport type { IDiagnosticReporter } from '../../../utils/diagnostic';\nimport type { Client, Server, Auth } from '../../../types/remote/protocol';\nimport type { ILocalStrapiDestinationProviderOptions } from '../local-destination';\nimport { TRANSFER_PATH } from '../../remote/constants';\nimport { ProviderTransferError, ProviderValidationError } from '../../../errors/providers';\nimport {\n createTransferAssetStreamChunk,\n createTransferAssetStreamChunkLegacy,\n transferAssetStreamChunkByteLength,\n} from '../../../utils/transfer-asset-chunk';\n\nexport interface IRemoteStrapiDestinationProviderOptions\n extends Pick<ILocalStrapiDestinationProviderOptions, 'restore' | 'strategy' | 'onTransferPhase'> {\n url: URL; // the url of the remote Strapi admin\n auth?: Auth.ITransferTokenAuth;\n retryMessageOptions?: {\n retryMessageTimeout: number; // milliseconds to wait for a response from a message\n retryMessageMaxRetries: number; // max number of retries for a message before aborting transfer\n };\n /** Include per-asset stream checksums and require peers to validate on receive. */\n verifyChecksums?: boolean;\n}\n\nconst jsonLength = (obj: object) => Buffer.byteLength(JSON.stringify(obj));\n\n/**\n * Default batching for entities / links / configuration over WebSocket push.\n *\n * Goals: (1) enough payload per round-trip to stay efficient on large transfers,\n * (2) small enough per message that the remote can process and ack without multi-minute stalls,\n * (3) bounded gap between engine progress and the wire (see item cap + age).\n *\n * These are fixed defaults (not tuned per dataset) so behavior is predictable everywhere.\n */\nconst STREAM_STEP_MAX_BATCH_BYTES = 512 * 1024;\n\n/** Caps parallel work per message and how far UI count can lead the network for tiny rows. */\nconst STREAM_STEP_MAX_BATCH_ITEMS = 100;\n\n/**\n * If the first row in the current batch has waited this long, flush before appending more.\n * Helps mixed-size streams (e.g. occasional large rows) without relying on tiny byte caps alone.\n */\nconst STREAM_STEP_MAX_BATCH_AGE_MS = 450;\n\nclass RemoteStrapiDestinationProvider implements IDestinationProvider {\n name = 'destination::remote-strapi';\n\n type: ProviderType = 'destination';\n\n options: IRemoteStrapiDestinationProviderOptions;\n\n ws: WebSocket | null;\n\n dispatcher: ReturnType<typeof createDispatcher> | null;\n\n transferID: string | null;\n\n stats!: { [TStage in Exclude<TransferStage, 'schemas'>]: { count: number } };\n\n #diagnostics?: IDiagnosticReporter;\n\n #checksumsEnabled = false;\n\n /**\n * Wire format for asset chunks. `'base64'` is the compact default introduced in #23479; remotes\n * that predate that PR do `Buffer.from(item.data.data)` directly and need the legacy\n * `{ type: 'Buffer', data: number[] }` shape instead. Set by init negotiation.\n */\n #assetEncoding: 'base64' | 'legacy-buffer-json' = 'base64';\n\n constructor(options: IRemoteStrapiDestinationProviderOptions) {\n this.options = options;\n this.ws = null;\n this.dispatcher = null;\n this.transferID = null;\n this.#checksumsEnabled = options.verifyChecksums === true;\n\n this.resetStats();\n }\n\n private resetStats() {\n this.stats = {\n assets: { count: 0 },\n entities: { count: 0 },\n links: { count: 0 },\n configuration: { count: 0 },\n };\n }\n\n async initTransfer(): Promise<string> {\n const { strategy, restore } = this.options;\n const wantsChecksums = this.options.verifyChecksums === true;\n\n const query = this.dispatcher?.dispatchCommand({\n command: 'init',\n params: {\n options: { strategy, restore },\n transfer: 'push',\n ...(wantsChecksums ? { checksums: true } : {}),\n assetEncoding: 'base64',\n },\n });\n\n const res = (await query) as\n | (Server.Payload<Server.InitMessage> & {\n checksums?: boolean;\n assetEncoding?: 'base64';\n })\n | null;\n if (!res?.transferID) {\n throw new ProviderTransferError('Init failed, invalid response from the server');\n }\n this.#checksumsEnabled = wantsChecksums && res.checksums === true;\n if (wantsChecksums && res.checksums !== true) {\n this.#reportWarning(\n '[Data transfer][push] Checksums were requested but the remote does not support checksum negotiation; continuing without checksum validation.'\n );\n }\n\n // A remote that predates #23479 silently drops the `assetEncoding` field instead of echoing\n // it. Falling back to the legacy Buffer JSON shape keeps small pushes working against those\n // remotes; large pushes may still OOM the remote during `JSON.parse` because that shape\n // allocates the full byte array — emit a warning so the user understands the trade-off.\n if (res.assetEncoding === 'base64') {\n this.#assetEncoding = 'base64';\n } else {\n this.#assetEncoding = 'legacy-buffer-json';\n this.#reportWarning(\n '[Data transfer][push] Remote does not support the compact base64 asset-chunk format; ' +\n 'falling back to legacy Buffer JSON. Large files may cause out-of-memory errors on the remote — ' +\n 'upgrade the remote Strapi to pick up PR #23479 to use the memory-bounded wire format.'\n );\n }\n\n this.resetStats();\n\n return res.transferID;\n }\n\n #startStepOnce(stage: Client.TransferPushStep) {\n return once(() => this.#startStep(stage));\n }\n\n async #startStep<T extends Client.TransferPushStep>(step: T) {\n try {\n await this.dispatcher?.dispatchTransferStep({ action: 'start', step });\n } catch (e) {\n if (e instanceof Error) {\n return e;\n }\n\n if (typeof e === 'string') {\n return new ProviderTransferError(e);\n }\n\n return new ProviderTransferError('Unexpected error');\n }\n\n this.stats[step] = { count: 0 };\n\n return null;\n }\n\n async #endStep<T extends Client.TransferPushStep>(step: T) {\n try {\n const res = await this.dispatcher?.dispatchTransferStep<{\n ok: boolean;\n stats: Protocol.Client.Stats;\n }>({\n action: 'end',\n step,\n });\n\n return { stats: res?.stats ?? null, error: null };\n } catch (e) {\n if (e instanceof Error) {\n return { stats: null, error: e };\n }\n\n if (typeof e === 'string') {\n return { stats: null, error: new ProviderTransferError(e) };\n }\n\n return { stats: null, error: new ProviderTransferError('Unexpected error') };\n }\n }\n\n async #streamStep<T extends Client.TransferPushStep>(\n step: T,\n message: Client.GetTransferPushStreamData<T>\n ) {\n try {\n if (step === 'assets') {\n const assetMessage = message as Protocol.Client.TransferAssetFlow[];\n this.stats[step].count += assetMessage.filter((data) => data.action === 'start').length;\n } else {\n this.stats[step].count += message.length;\n }\n\n await this.dispatcher?.dispatchTransferStep({ action: 'stream', step, data: message });\n } catch (e) {\n if (e instanceof Error) {\n return e;\n }\n\n if (typeof e === 'string') {\n return new ProviderTransferError(e);\n }\n\n return new ProviderTransferError('Unexpected error');\n }\n\n return null;\n }\n\n #writeStream(step: Exclude<Client.TransferPushStep, 'assets'>): Writable {\n type Step = typeof step;\n\n const startTransferOnce = this.#startStepOnce(step);\n\n let batch = [] as Client.GetTransferPushStreamData<Step>;\n let batchStartedAt = 0;\n\n const batchLength = () => jsonLength(batch);\n\n const flushBatch = async (): Promise<Error | null> => {\n if (batch.length === 0) {\n return null;\n }\n const payload = batch;\n batch = [];\n batchStartedAt = 0;\n return this.#streamStep(step, payload);\n };\n\n const shouldFlushBatchAfterPush = () => {\n if (batch.length === 0) {\n return false;\n }\n return (\n batchLength() >= STREAM_STEP_MAX_BATCH_BYTES ||\n batch.length >= STREAM_STEP_MAX_BATCH_ITEMS ||\n Date.now() - batchStartedAt >= STREAM_STEP_MAX_BATCH_AGE_MS\n );\n };\n\n return new Writable({\n objectMode: true,\n\n final: async (callback) => {\n if (batch.length > 0) {\n const streamError = await flushBatch();\n\n if (streamError) {\n return callback(streamError);\n }\n }\n const { error, stats } = await this.#endStep(step);\n\n const { count } = this.stats[step];\n\n if (stats && (stats.started !== count || stats.finished !== count)) {\n callback(\n new Error(\n `Data missing: sent ${this.stats[step].count} ${step}, received ${stats.started} and saved ${stats.finished} ${step}`\n )\n );\n }\n\n callback(error);\n },\n\n async write(chunk, _encoding, callback) {\n const startError = await startTransferOnce();\n if (startError) {\n return callback(startError);\n }\n\n // Flush a batch that has sat long enough before growing it further (bounded latency).\n if (batch.length > 0 && Date.now() - batchStartedAt >= STREAM_STEP_MAX_BATCH_AGE_MS) {\n const staleError = await flushBatch();\n if (staleError) {\n return callback(staleError);\n }\n }\n\n batch.push(chunk);\n if (batch.length === 1) {\n batchStartedAt = Date.now();\n }\n\n if (shouldFlushBatchAfterPush()) {\n const streamError = await flushBatch();\n if (streamError) {\n return callback(streamError);\n }\n }\n\n callback();\n },\n });\n }\n\n #reportInfo(message: string) {\n this.#diagnostics?.report({\n details: {\n createdAt: new Date(),\n message,\n origin: 'remote-destination-provider',\n },\n kind: 'info',\n });\n }\n\n #reportWarning(message: string) {\n this.#diagnostics?.report({\n details: {\n createdAt: new Date(),\n message,\n origin: 'remote-destination-provider',\n },\n kind: 'warning',\n });\n }\n\n async bootstrap(diagnostics?: IDiagnosticReporter): Promise<void> {\n this.#diagnostics = diagnostics;\n const { url, auth } = this.options;\n const validProtocols = ['https:', 'http:'];\n\n let ws: WebSocket;\n\n if (!validProtocols.includes(url.protocol)) {\n throw new ProviderValidationError(`Invalid protocol \"${url.protocol}\"`, {\n check: 'url',\n details: {\n protocol: url.protocol,\n validProtocols,\n },\n });\n }\n const wsProtocol = url.protocol === 'https:' ? 'wss:' : 'ws:';\n const wsUrl = `${wsProtocol}//${url.host}${trimTrailingSlash(\n url.pathname\n )}${TRANSFER_PATH}/push`;\n\n this.#reportInfo('establishing websocket connection');\n // No auth defined, trying public access for transfer\n if (!auth) {\n ws = await connectToWebsocket(wsUrl, undefined, this.#diagnostics);\n }\n\n // Common token auth, this should be the main auth method\n else if (auth.type === 'token') {\n const headers = { Authorization: `Bearer ${auth.token}` };\n ws = await connectToWebsocket(wsUrl, { headers }, this.#diagnostics);\n }\n\n // Invalid auth method provided\n else {\n throw new ProviderValidationError('Auth method not available', {\n check: 'auth.type',\n details: {\n auth: auth.type,\n },\n });\n }\n\n this.#reportInfo('established websocket connection');\n\n this.ws = ws;\n const { retryMessageOptions } = this.options;\n\n this.#reportInfo('creating dispatcher');\n this.dispatcher = createDispatcher(this.ws, retryMessageOptions, (message: string) =>\n this.#reportInfo(message)\n );\n this.#reportInfo('created dispatcher');\n\n this.#reportInfo('initialize transfer');\n this.transferID = await this.initTransfer();\n this.#reportInfo(`initialized transfer ${this.transferID}`);\n\n this.dispatcher.setTransferProperties({ id: this.transferID, kind: 'push' });\n\n await this.dispatcher.dispatchTransferAction('bootstrap');\n }\n\n async close() {\n // Gracefully close the remote transfer process\n if (this.transferID && this.dispatcher) {\n await this.dispatcher.dispatchTransferAction('close');\n\n await this.dispatcher.dispatchCommand({\n command: 'end',\n params: { transferID: this.transferID },\n });\n }\n\n await new Promise<void>((resolve) => {\n const { ws } = this;\n\n if (!ws || ws.CLOSED) {\n resolve();\n return;\n }\n\n ws.on('close', () => resolve()).close();\n });\n }\n\n getMetadata() {\n return this.dispatcher?.dispatchTransferAction<IMetadata>('getMetadata') ?? null;\n }\n\n async beforeTransfer() {\n this.options.onTransferPhase?.(\n 'Remote: waiting for server to clear data and prepare destination…'\n );\n await this.dispatcher?.dispatchTransferAction('beforeTransfer');\n }\n\n async rollback() {\n await this.dispatcher?.dispatchTransferAction('rollback');\n }\n\n getSchemas() {\n if (!this.dispatcher) {\n return Promise.resolve(null);\n }\n\n return this.dispatcher.dispatchTransferAction<Utils.String.Dict<Struct.Schema>>('getSchemas');\n }\n\n createEntitiesWriteStream(): Writable {\n return this.#writeStream('entities');\n }\n\n createLinksWriteStream(): Writable {\n return this.#writeStream('links');\n }\n\n createConfigurationWriteStream(): Writable {\n return this.#writeStream('configuration');\n }\n\n createAssetsWriteStream(): Writable | Promise<Writable> {\n let batch: Client.TransferAssetFlow[] = [];\n let hasStarted = false;\n const verifyChecksums = this.#checksumsEnabled;\n const encodeAssetChunk =\n this.#assetEncoding === 'base64'\n ? createTransferAssetStreamChunk\n : createTransferAssetStreamChunkLegacy;\n\n const batchSize = 1024 * 1024; // 1MB;\n const batchLength = () => {\n return batch.reduce((acc, chunk) => acc + transferAssetStreamChunkByteLength(chunk), 0);\n };\n const startAssetsTransferOnce = this.#startStepOnce('assets');\n\n const flush = async () => {\n const streamError = await this.#streamStep('assets', batch);\n batch = [];\n return streamError;\n };\n\n const safePush = async (chunk: Client.TransferAssetFlow) => {\n batch.push(chunk);\n\n if (batchLength() >= batchSize) {\n const streamError = await flush();\n if (streamError) {\n throw streamError;\n }\n }\n };\n\n return new Writable({\n objectMode: true,\n final: async (callback) => {\n if (batch.length > 0) {\n await flush();\n }\n\n if (hasStarted) {\n const { error: endStepError } = await this.#endStep('assets');\n\n if (endStepError) {\n return callback(endStepError);\n }\n }\n\n return callback(null);\n },\n\n async write(asset: IAsset, _encoding, callback) {\n const startError = await startAssetsTransferOnce();\n if (startError) {\n return callback(startError);\n }\n\n hasStarted = true;\n\n const assetID = randomUUID();\n const { filename, filepath, stats, stream, metadata } = asset;\n const checksumHash = verifyChecksums ? createHash('sha256') : undefined;\n\n try {\n await safePush({\n action: 'start',\n assetID,\n data: { filename, filepath, stats, metadata },\n });\n\n for await (const chunk of stream) {\n checksumHash?.update(chunk);\n await safePush(encodeAssetChunk(assetID, chunk));\n }\n\n await safePush({\n action: 'end',\n assetID,\n ...(checksumHash\n ? { checksum: { algorithm: 'sha256' as const, value: checksumHash.digest('hex') } }\n : {}),\n });\n\n callback();\n } catch (error) {\n callback(error instanceof Error ? error : new Error(String(error)));\n }\n },\n });\n }\n}\n\nexport const createRemoteStrapiDestinationProvider = (\n options: IRemoteStrapiDestinationProviderOptions\n) => {\n return new RemoteStrapiDestinationProvider(options);\n};\n"],"names":["jsonLength","obj","Buffer","byteLength","JSON","stringify","STREAM_STEP_MAX_BATCH_BYTES","STREAM_STEP_MAX_BATCH_ITEMS","STREAM_STEP_MAX_BATCH_AGE_MS","RemoteStrapiDestinationProvider","resetStats","stats","assets","count","entities","links","configuration","initTransfer","strategy","restore","options","wantsChecksums","verifyChecksums","query","dispatcher","dispatchCommand","command","params","transfer","checksums","assetEncoding","res","transferID","ProviderTransferError","bootstrap","diagnostics","url","auth","validProtocols","ws","includes","protocol","ProviderValidationError","check","details","wsProtocol","wsUrl","host","trimTrailingSlash","pathname","TRANSFER_PATH","connectToWebsocket","undefined","type","headers","Authorization","token","retryMessageOptions","createDispatcher","message","setTransferProperties","id","kind","dispatchTransferAction","close","Promise","resolve","CLOSED","on","getMetadata","beforeTransfer","onTransferPhase","rollback","getSchemas","createEntitiesWriteStream","createLinksWriteStream","createConfigurationWriteStream","createAssetsWriteStream","batch","hasStarted","encodeAssetChunk","createTransferAssetStreamChunk","createTransferAssetStreamChunkLegacy","batchSize","batchLength","reduce","acc","chunk","transferAssetStreamChunkByteLength","startAssetsTransferOnce","flush","streamError","safePush","push","Writable","objectMode","final","callback","length","error","endStepError","write","asset","_encoding","startError","assetID","randomUUID","filename","filepath","stream","metadata","checksumHash","createHash","action","data","update","checksum","algorithm","value","digest","Error","String","name","stage","once","step","dispatchTransferStep","e","assetMessage","filter","startTransferOnce","batchStartedAt","flushBatch","payload","shouldFlushBatchAfterPush","Date","now","started","finished","staleError","report","createdAt","origin","createRemoteStrapiDestinationProvider"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../../src/strapi/providers/remote-destination/index.ts"],"sourcesContent":["import { createHash, randomUUID } from 'crypto';\nimport { Writable } from 'stream';\nimport { WebSocket } from 'ws';\nimport { once } from 'lodash';\nimport type { Struct, Utils } from '@strapi/types';\n\nimport { createDispatcher, connectToWebsocket, trimTrailingSlash } from '../utils';\n\nimport type {\n IDestinationProvider,\n IMetadata,\n ProviderType,\n IAsset,\n TransferStage,\n Protocol,\n} from '../../../types';\nimport type { IDiagnosticReporter } from '../../../utils/diagnostic';\nimport type { Client, Server, Auth } from '../../../types/remote/protocol';\nimport type { ILocalStrapiDestinationProviderOptions } from '../local-destination';\nimport { TRANSFER_PATH } from '../../remote/constants';\nimport { ProviderTransferError, ProviderValidationError } from '../../../errors/providers';\nimport {\n createTransferAssetStreamChunk,\n createTransferAssetStreamChunkLegacy,\n transferAssetStreamChunkByteLength,\n} from '../../../utils/transfer-asset-chunk';\n\nexport interface IRemoteStrapiDestinationProviderOptions extends Pick<\n ILocalStrapiDestinationProviderOptions,\n 'restore' | 'strategy' | 'onTransferPhase'\n> {\n url: URL; // the url of the remote Strapi admin\n auth?: Auth.ITransferTokenAuth;\n retryMessageOptions?: {\n retryMessageTimeout: number; // milliseconds to wait for a response from a message\n retryMessageMaxRetries: number; // max number of retries for a message before aborting transfer\n };\n /** Include per-asset stream checksums and require peers to validate on receive. */\n verifyChecksums?: boolean;\n}\n\nconst jsonLength = (obj: object) => Buffer.byteLength(JSON.stringify(obj));\n\n/**\n * Default batching for entities / links / configuration over WebSocket push.\n *\n * Goals: (1) enough payload per round-trip to stay efficient on large transfers,\n * (2) small enough per message that the remote can process and ack without multi-minute stalls,\n * (3) bounded gap between engine progress and the wire (see item cap + age).\n *\n * These are fixed defaults (not tuned per dataset) so behavior is predictable everywhere.\n */\nconst STREAM_STEP_MAX_BATCH_BYTES = 512 * 1024;\n\n/** Caps parallel work per message and how far UI count can lead the network for tiny rows. */\nconst STREAM_STEP_MAX_BATCH_ITEMS = 100;\n\n/**\n * If the first row in the current batch has waited this long, flush before appending more.\n * Helps mixed-size streams (e.g. occasional large rows) without relying on tiny byte caps alone.\n */\nconst STREAM_STEP_MAX_BATCH_AGE_MS = 450;\n\nclass RemoteStrapiDestinationProvider implements IDestinationProvider {\n name = 'destination::remote-strapi';\n\n type: ProviderType = 'destination';\n\n options: IRemoteStrapiDestinationProviderOptions;\n\n ws: WebSocket | null;\n\n dispatcher: ReturnType<typeof createDispatcher> | null;\n\n transferID: string | null;\n\n stats!: { [TStage in Exclude<TransferStage, 'schemas'>]: { count: number } };\n\n #diagnostics?: IDiagnosticReporter;\n\n #checksumsEnabled = false;\n\n /**\n * Wire format for asset chunks. `'base64'` is the compact default introduced in #23479; remotes\n * that predate that PR do `Buffer.from(item.data.data)` directly and need the legacy\n * `{ type: 'Buffer', data: number[] }` shape instead. Set by init negotiation.\n */\n #assetEncoding: 'base64' | 'legacy-buffer-json' = 'base64';\n\n constructor(options: IRemoteStrapiDestinationProviderOptions) {\n this.options = options;\n this.ws = null;\n this.dispatcher = null;\n this.transferID = null;\n this.#checksumsEnabled = options.verifyChecksums === true;\n\n this.resetStats();\n }\n\n private resetStats() {\n this.stats = {\n assets: { count: 0 },\n entities: { count: 0 },\n links: { count: 0 },\n configuration: { count: 0 },\n };\n }\n\n async initTransfer(): Promise<string> {\n const { strategy, restore } = this.options;\n const wantsChecksums = this.options.verifyChecksums === true;\n\n const query = this.dispatcher?.dispatchCommand({\n command: 'init',\n params: {\n options: { strategy, restore },\n transfer: 'push',\n ...(wantsChecksums ? { checksums: true } : {}),\n assetEncoding: 'base64',\n },\n });\n\n const res = (await query) as\n | (Server.Payload<Server.InitMessage> & {\n checksums?: boolean;\n assetEncoding?: 'base64';\n })\n | null;\n if (!res?.transferID) {\n throw new ProviderTransferError('Init failed, invalid response from the server');\n }\n this.#checksumsEnabled = wantsChecksums && res.checksums === true;\n if (wantsChecksums && res.checksums !== true) {\n this.#reportWarning(\n '[Data transfer][push] Checksums were requested but the remote does not support checksum negotiation; continuing without checksum validation.'\n );\n }\n\n // A remote that predates #23479 silently drops the `assetEncoding` field instead of echoing\n // it. Falling back to the legacy Buffer JSON shape keeps small pushes working against those\n // remotes; large pushes may still OOM the remote during `JSON.parse` because that shape\n // allocates the full byte array — emit a warning so the user understands the trade-off.\n if (res.assetEncoding === 'base64') {\n this.#assetEncoding = 'base64';\n } else {\n this.#assetEncoding = 'legacy-buffer-json';\n this.#reportWarning(\n '[Data transfer][push] Remote does not support the compact base64 asset-chunk format; ' +\n 'falling back to legacy Buffer JSON. Large files may cause out-of-memory errors on the remote — ' +\n 'upgrade the remote Strapi to pick up PR #23479 to use the memory-bounded wire format.'\n );\n }\n\n this.resetStats();\n\n return res.transferID;\n }\n\n #startStepOnce(stage: Client.TransferPushStep) {\n return once(() => this.#startStep(stage));\n }\n\n async #startStep<T extends Client.TransferPushStep>(step: T) {\n try {\n await this.dispatcher?.dispatchTransferStep({ action: 'start', step });\n } catch (e) {\n if (e instanceof Error) {\n return e;\n }\n\n if (typeof e === 'string') {\n return new ProviderTransferError(e);\n }\n\n return new ProviderTransferError('Unexpected error');\n }\n\n this.stats[step] = { count: 0 };\n\n return null;\n }\n\n async #endStep<T extends Client.TransferPushStep>(step: T) {\n try {\n const res = await this.dispatcher?.dispatchTransferStep<{\n ok: boolean;\n stats: Protocol.Client.Stats;\n }>({\n action: 'end',\n step,\n });\n\n return { stats: res?.stats ?? null, error: null };\n } catch (e) {\n if (e instanceof Error) {\n return { stats: null, error: e };\n }\n\n if (typeof e === 'string') {\n return { stats: null, error: new ProviderTransferError(e) };\n }\n\n return { stats: null, error: new ProviderTransferError('Unexpected error') };\n }\n }\n\n async #streamStep<T extends Client.TransferPushStep>(\n step: T,\n message: Client.GetTransferPushStreamData<T>\n ) {\n try {\n if (step === 'assets') {\n const assetMessage = message as Protocol.Client.TransferAssetFlow[];\n this.stats[step].count += assetMessage.filter((data) => data.action === 'start').length;\n } else {\n this.stats[step].count += message.length;\n }\n\n await this.dispatcher?.dispatchTransferStep({ action: 'stream', step, data: message });\n } catch (e) {\n if (e instanceof Error) {\n return e;\n }\n\n if (typeof e === 'string') {\n return new ProviderTransferError(e);\n }\n\n return new ProviderTransferError('Unexpected error');\n }\n\n return null;\n }\n\n #writeStream(step: Exclude<Client.TransferPushStep, 'assets'>): Writable {\n type Step = typeof step;\n\n const startTransferOnce = this.#startStepOnce(step);\n\n let batch = [] as Client.GetTransferPushStreamData<Step>;\n let batchStartedAt = 0;\n\n const batchLength = () => jsonLength(batch);\n\n const flushBatch = async (): Promise<Error | null> => {\n if (batch.length === 0) {\n return null;\n }\n const payload = batch;\n batch = [];\n batchStartedAt = 0;\n return this.#streamStep(step, payload);\n };\n\n const shouldFlushBatchAfterPush = () => {\n if (batch.length === 0) {\n return false;\n }\n return (\n batchLength() >= STREAM_STEP_MAX_BATCH_BYTES ||\n batch.length >= STREAM_STEP_MAX_BATCH_ITEMS ||\n Date.now() - batchStartedAt >= STREAM_STEP_MAX_BATCH_AGE_MS\n );\n };\n\n return new Writable({\n objectMode: true,\n\n final: async (callback) => {\n if (batch.length > 0) {\n const streamError = await flushBatch();\n\n if (streamError) {\n return callback(streamError);\n }\n }\n const { error, stats } = await this.#endStep(step);\n\n const { count } = this.stats[step];\n\n if (stats && (stats.started !== count || stats.finished !== count)) {\n callback(\n new Error(\n `Data missing: sent ${this.stats[step].count} ${step}, received ${stats.started} and saved ${stats.finished} ${step}`\n )\n );\n }\n\n callback(error);\n },\n\n async write(chunk, _encoding, callback) {\n const startError = await startTransferOnce();\n if (startError) {\n return callback(startError);\n }\n\n // Flush a batch that has sat long enough before growing it further (bounded latency).\n if (batch.length > 0 && Date.now() - batchStartedAt >= STREAM_STEP_MAX_BATCH_AGE_MS) {\n const staleError = await flushBatch();\n if (staleError) {\n return callback(staleError);\n }\n }\n\n batch.push(chunk);\n if (batch.length === 1) {\n batchStartedAt = Date.now();\n }\n\n if (shouldFlushBatchAfterPush()) {\n const streamError = await flushBatch();\n if (streamError) {\n return callback(streamError);\n }\n }\n\n callback();\n },\n });\n }\n\n #reportInfo(message: string) {\n this.#diagnostics?.report({\n details: {\n createdAt: new Date(),\n message,\n origin: 'remote-destination-provider',\n },\n kind: 'info',\n });\n }\n\n #reportWarning(message: string) {\n this.#diagnostics?.report({\n details: {\n createdAt: new Date(),\n message,\n origin: 'remote-destination-provider',\n },\n kind: 'warning',\n });\n }\n\n async bootstrap(diagnostics?: IDiagnosticReporter): Promise<void> {\n this.#diagnostics = diagnostics;\n const { url, auth } = this.options;\n const validProtocols = ['https:', 'http:'];\n\n let ws: WebSocket;\n\n if (!validProtocols.includes(url.protocol)) {\n throw new ProviderValidationError(`Invalid protocol \"${url.protocol}\"`, {\n check: 'url',\n details: {\n protocol: url.protocol,\n validProtocols,\n },\n });\n }\n const wsProtocol = url.protocol === 'https:' ? 'wss:' : 'ws:';\n const wsUrl = `${wsProtocol}//${url.host}${trimTrailingSlash(\n url.pathname\n )}${TRANSFER_PATH}/push`;\n\n this.#reportInfo('establishing websocket connection');\n // No auth defined, trying public access for transfer\n if (!auth) {\n ws = await connectToWebsocket(wsUrl, undefined, this.#diagnostics);\n }\n\n // Common token auth, this should be the main auth method\n else if (auth.type === 'token') {\n const headers = { Authorization: `Bearer ${auth.token}` };\n ws = await connectToWebsocket(wsUrl, { headers }, this.#diagnostics);\n }\n\n // Invalid auth method provided\n else {\n throw new ProviderValidationError('Auth method not available', {\n check: 'auth.type',\n details: {\n auth: auth.type,\n },\n });\n }\n\n this.#reportInfo('established websocket connection');\n\n this.ws = ws;\n const { retryMessageOptions } = this.options;\n\n this.#reportInfo('creating dispatcher');\n this.dispatcher = createDispatcher(this.ws, retryMessageOptions, (message: string) =>\n this.#reportInfo(message)\n );\n this.#reportInfo('created dispatcher');\n\n this.#reportInfo('initialize transfer');\n this.transferID = await this.initTransfer();\n this.#reportInfo(`initialized transfer ${this.transferID}`);\n\n this.dispatcher.setTransferProperties({ id: this.transferID, kind: 'push' });\n\n await this.dispatcher.dispatchTransferAction('bootstrap');\n }\n\n async close() {\n // Gracefully close the remote transfer process\n if (this.transferID && this.dispatcher) {\n await this.dispatcher.dispatchTransferAction('close');\n\n await this.dispatcher.dispatchCommand({\n command: 'end',\n params: { transferID: this.transferID },\n });\n }\n\n await new Promise<void>((resolve) => {\n const { ws } = this;\n\n if (!ws || ws.CLOSED) {\n resolve();\n return;\n }\n\n ws.on('close', () => resolve()).close();\n });\n }\n\n getMetadata() {\n return this.dispatcher?.dispatchTransferAction<IMetadata>('getMetadata') ?? null;\n }\n\n async beforeTransfer() {\n this.options.onTransferPhase?.(\n 'Remote: waiting for server to clear data and prepare destination…'\n );\n await this.dispatcher?.dispatchTransferAction('beforeTransfer');\n }\n\n async rollback() {\n await this.dispatcher?.dispatchTransferAction('rollback');\n }\n\n getSchemas() {\n if (!this.dispatcher) {\n return Promise.resolve(null);\n }\n\n return this.dispatcher.dispatchTransferAction<Utils.String.Dict<Struct.Schema>>('getSchemas');\n }\n\n createEntitiesWriteStream(): Writable {\n return this.#writeStream('entities');\n }\n\n createLinksWriteStream(): Writable {\n return this.#writeStream('links');\n }\n\n createConfigurationWriteStream(): Writable {\n return this.#writeStream('configuration');\n }\n\n createAssetsWriteStream(): Writable | Promise<Writable> {\n let batch: Client.TransferAssetFlow[] = [];\n let hasStarted = false;\n const verifyChecksums = this.#checksumsEnabled;\n const encodeAssetChunk =\n this.#assetEncoding === 'base64'\n ? createTransferAssetStreamChunk\n : createTransferAssetStreamChunkLegacy;\n\n const batchSize = 1024 * 1024; // 1MB;\n const batchLength = () => {\n return batch.reduce((acc, chunk) => acc + transferAssetStreamChunkByteLength(chunk), 0);\n };\n const startAssetsTransferOnce = this.#startStepOnce('assets');\n\n const flush = async () => {\n const streamError = await this.#streamStep('assets', batch);\n batch = [];\n return streamError;\n };\n\n const safePush = async (chunk: Client.TransferAssetFlow) => {\n batch.push(chunk);\n\n if (batchLength() >= batchSize) {\n const streamError = await flush();\n if (streamError) {\n throw streamError;\n }\n }\n };\n\n return new Writable({\n objectMode: true,\n final: async (callback) => {\n if (batch.length > 0) {\n await flush();\n }\n\n if (hasStarted) {\n const { error: endStepError } = await this.#endStep('assets');\n\n if (endStepError) {\n return callback(endStepError);\n }\n }\n\n return callback(null);\n },\n\n async write(asset: IAsset, _encoding, callback) {\n const startError = await startAssetsTransferOnce();\n if (startError) {\n return callback(startError);\n }\n\n hasStarted = true;\n\n const assetID = randomUUID();\n const { filename, filepath, stats, stream, metadata } = asset;\n const checksumHash = verifyChecksums ? createHash('sha256') : undefined;\n\n try {\n await safePush({\n action: 'start',\n assetID,\n data: { filename, filepath, stats, metadata },\n });\n\n for await (const chunk of stream) {\n checksumHash?.update(chunk);\n await safePush(encodeAssetChunk(assetID, chunk));\n }\n\n await safePush({\n action: 'end',\n assetID,\n ...(checksumHash\n ? { checksum: { algorithm: 'sha256' as const, value: checksumHash.digest('hex') } }\n : {}),\n });\n\n callback();\n } catch (error) {\n callback(error instanceof Error ? error : new Error(String(error)));\n }\n },\n });\n }\n}\n\nexport const createRemoteStrapiDestinationProvider = (\n options: IRemoteStrapiDestinationProviderOptions\n) => {\n return new RemoteStrapiDestinationProvider(options);\n};\n"],"names":["jsonLength","obj","Buffer","byteLength","JSON","stringify","STREAM_STEP_MAX_BATCH_BYTES","STREAM_STEP_MAX_BATCH_ITEMS","STREAM_STEP_MAX_BATCH_AGE_MS","RemoteStrapiDestinationProvider","resetStats","stats","assets","count","entities","links","configuration","initTransfer","strategy","restore","options","wantsChecksums","verifyChecksums","query","dispatcher","dispatchCommand","command","params","transfer","checksums","assetEncoding","res","transferID","ProviderTransferError","bootstrap","diagnostics","url","auth","validProtocols","ws","includes","protocol","ProviderValidationError","check","details","wsProtocol","wsUrl","host","trimTrailingSlash","pathname","TRANSFER_PATH","connectToWebsocket","undefined","type","headers","Authorization","token","retryMessageOptions","createDispatcher","message","setTransferProperties","id","kind","dispatchTransferAction","close","Promise","resolve","CLOSED","on","getMetadata","beforeTransfer","onTransferPhase","rollback","getSchemas","createEntitiesWriteStream","createLinksWriteStream","createConfigurationWriteStream","createAssetsWriteStream","batch","hasStarted","encodeAssetChunk","createTransferAssetStreamChunk","createTransferAssetStreamChunkLegacy","batchSize","batchLength","reduce","acc","chunk","transferAssetStreamChunkByteLength","startAssetsTransferOnce","flush","streamError","safePush","push","Writable","objectMode","final","callback","length","error","endStepError","write","asset","_encoding","startError","assetID","randomUUID","filename","filepath","stream","metadata","checksumHash","createHash","action","data","update","checksum","algorithm","value","digest","Error","String","name","stage","once","step","dispatchTransferStep","e","assetMessage","filter","startTransferOnce","batchStartedAt","flushBatch","payload","shouldFlushBatchAfterPush","Date","now","started","finished","staleError","report","createdAt","origin","createRemoteStrapiDestinationProvider"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../../src/strapi/providers/remote-destination/index.ts"],"sourcesContent":["import { createHash, randomUUID } from 'crypto';\nimport { Writable } from 'stream';\nimport { WebSocket } from 'ws';\nimport { once } from 'lodash';\nimport type { Struct, Utils } from '@strapi/types';\n\nimport { createDispatcher, connectToWebsocket, trimTrailingSlash } from '../utils';\n\nimport type {\n IDestinationProvider,\n IMetadata,\n ProviderType,\n IAsset,\n TransferStage,\n Protocol,\n} from '../../../types';\nimport type { IDiagnosticReporter } from '../../../utils/diagnostic';\nimport type { Client, Server, Auth } from '../../../types/remote/protocol';\nimport type { ILocalStrapiDestinationProviderOptions } from '../local-destination';\nimport { TRANSFER_PATH } from '../../remote/constants';\nimport { ProviderTransferError, ProviderValidationError } from '../../../errors/providers';\nimport {\n createTransferAssetStreamChunk,\n createTransferAssetStreamChunkLegacy,\n transferAssetStreamChunkByteLength,\n} from '../../../utils/transfer-asset-chunk';\n\nexport interface IRemoteStrapiDestinationProviderOptions\n extends Pick<ILocalStrapiDestinationProviderOptions, 'restore' | 'strategy' | 'onTransferPhase'> {\n url: URL; // the url of the remote Strapi admin\n auth?: Auth.ITransferTokenAuth;\n retryMessageOptions?: {\n retryMessageTimeout: number; // milliseconds to wait for a response from a message\n retryMessageMaxRetries: number; // max number of retries for a message before aborting transfer\n };\n /** Include per-asset stream checksums and require peers to validate on receive. */\n verifyChecksums?: boolean;\n}\n\nconst jsonLength = (obj: object) => Buffer.byteLength(JSON.stringify(obj));\n\n/**\n * Default batching for entities / links / configuration over WebSocket push.\n *\n * Goals: (1) enough payload per round-trip to stay efficient on large transfers,\n * (2) small enough per message that the remote can process and ack without multi-minute stalls,\n * (3) bounded gap between engine progress and the wire (see item cap + age).\n *\n * These are fixed defaults (not tuned per dataset) so behavior is predictable everywhere.\n */\nconst STREAM_STEP_MAX_BATCH_BYTES = 512 * 1024;\n\n/** Caps parallel work per message and how far UI count can lead the network for tiny rows. */\nconst STREAM_STEP_MAX_BATCH_ITEMS = 100;\n\n/**\n * If the first row in the current batch has waited this long, flush before appending more.\n * Helps mixed-size streams (e.g. occasional large rows) without relying on tiny byte caps alone.\n */\nconst STREAM_STEP_MAX_BATCH_AGE_MS = 450;\n\nclass RemoteStrapiDestinationProvider implements IDestinationProvider {\n name = 'destination::remote-strapi';\n\n type: ProviderType = 'destination';\n\n options: IRemoteStrapiDestinationProviderOptions;\n\n ws: WebSocket | null;\n\n dispatcher: ReturnType<typeof createDispatcher> | null;\n\n transferID: string | null;\n\n stats!: { [TStage in Exclude<TransferStage, 'schemas'>]: { count: number } };\n\n #diagnostics?: IDiagnosticReporter;\n\n #checksumsEnabled = false;\n\n /**\n * Wire format for asset chunks. `'base64'` is the compact default introduced in #23479; remotes\n * that predate that PR do `Buffer.from(item.data.data)` directly and need the legacy\n * `{ type: 'Buffer', data: number[] }` shape instead. Set by init negotiation.\n */\n #assetEncoding: 'base64' | 'legacy-buffer-json' = 'base64';\n\n constructor(options: IRemoteStrapiDestinationProviderOptions) {\n this.options = options;\n this.ws = null;\n this.dispatcher = null;\n this.transferID = null;\n this.#checksumsEnabled = options.verifyChecksums === true;\n\n this.resetStats();\n }\n\n private resetStats() {\n this.stats = {\n assets: { count: 0 },\n entities: { count: 0 },\n links: { count: 0 },\n configuration: { count: 0 },\n };\n }\n\n async initTransfer(): Promise<string> {\n const { strategy, restore } = this.options;\n const wantsChecksums = this.options.verifyChecksums === true;\n\n const query = this.dispatcher?.dispatchCommand({\n command: 'init',\n params: {\n options: { strategy, restore },\n transfer: 'push',\n ...(wantsChecksums ? { checksums: true } : {}),\n assetEncoding: 'base64',\n },\n });\n\n const res = (await query) as\n | (Server.Payload<Server.InitMessage> & {\n checksums?: boolean;\n assetEncoding?: 'base64';\n })\n | null;\n if (!res?.transferID) {\n throw new ProviderTransferError('Init failed, invalid response from the server');\n }\n this.#checksumsEnabled = wantsChecksums && res.checksums === true;\n if (wantsChecksums && res.checksums !== true) {\n this.#reportWarning(\n '[Data transfer][push] Checksums were requested but the remote does not support checksum negotiation; continuing without checksum validation.'\n );\n }\n\n // A remote that predates #23479 silently drops the `assetEncoding` field instead of echoing\n // it. Falling back to the legacy Buffer JSON shape keeps small pushes working against those\n // remotes; large pushes may still OOM the remote during `JSON.parse` because that shape\n // allocates the full byte array — emit a warning so the user understands the trade-off.\n if (res.assetEncoding === 'base64') {\n this.#assetEncoding = 'base64';\n } else {\n this.#assetEncoding = 'legacy-buffer-json';\n this.#reportWarning(\n '[Data transfer][push] Remote does not support the compact base64 asset-chunk format; ' +\n 'falling back to legacy Buffer JSON. Large files may cause out-of-memory errors on the remote — ' +\n 'upgrade the remote Strapi to pick up PR #23479 to use the memory-bounded wire format.'\n );\n }\n\n this.resetStats();\n\n return res.transferID;\n }\n\n #startStepOnce(stage: Client.TransferPushStep) {\n return once(() => this.#startStep(stage));\n }\n\n async #startStep<T extends Client.TransferPushStep>(step: T) {\n try {\n await this.dispatcher?.dispatchTransferStep({ action: 'start', step });\n } catch (e) {\n if (e instanceof Error) {\n return e;\n }\n\n if (typeof e === 'string') {\n return new ProviderTransferError(e);\n }\n\n return new ProviderTransferError('Unexpected error');\n }\n\n this.stats[step] = { count: 0 };\n\n return null;\n }\n\n async #endStep<T extends Client.TransferPushStep>(step: T) {\n try {\n const res = await this.dispatcher?.dispatchTransferStep<{\n ok: boolean;\n stats: Protocol.Client.Stats;\n }>({\n action: 'end',\n step,\n });\n\n return { stats: res?.stats ?? null, error: null };\n } catch (e) {\n if (e instanceof Error) {\n return { stats: null, error: e };\n }\n\n if (typeof e === 'string') {\n return { stats: null, error: new ProviderTransferError(e) };\n }\n\n return { stats: null, error: new ProviderTransferError('Unexpected error') };\n }\n }\n\n async #streamStep<T extends Client.TransferPushStep>(\n step: T,\n message: Client.GetTransferPushStreamData<T>\n ) {\n try {\n if (step === 'assets') {\n const assetMessage = message as Protocol.Client.TransferAssetFlow[];\n this.stats[step].count += assetMessage.filter((data) => data.action === 'start').length;\n } else {\n this.stats[step].count += message.length;\n }\n\n await this.dispatcher?.dispatchTransferStep({ action: 'stream', step, data: message });\n } catch (e) {\n if (e instanceof Error) {\n return e;\n }\n\n if (typeof e === 'string') {\n return new ProviderTransferError(e);\n }\n\n return new ProviderTransferError('Unexpected error');\n }\n\n return null;\n }\n\n #writeStream(step: Exclude<Client.TransferPushStep, 'assets'>): Writable {\n type Step = typeof step;\n\n const startTransferOnce = this.#startStepOnce(step);\n\n let batch = [] as Client.GetTransferPushStreamData<Step>;\n let batchStartedAt = 0;\n\n const batchLength = () => jsonLength(batch);\n\n const flushBatch = async (): Promise<Error | null> => {\n if (batch.length === 0) {\n return null;\n }\n const payload = batch;\n batch = [];\n batchStartedAt = 0;\n return this.#streamStep(step, payload);\n };\n\n const shouldFlushBatchAfterPush = () => {\n if (batch.length === 0) {\n return false;\n }\n return (\n batchLength() >= STREAM_STEP_MAX_BATCH_BYTES ||\n batch.length >= STREAM_STEP_MAX_BATCH_ITEMS ||\n Date.now() - batchStartedAt >= STREAM_STEP_MAX_BATCH_AGE_MS\n );\n };\n\n return new Writable({\n objectMode: true,\n\n final: async (callback) => {\n if (batch.length > 0) {\n const streamError = await flushBatch();\n\n if (streamError) {\n return callback(streamError);\n }\n }\n const { error, stats } = await this.#endStep(step);\n\n const { count } = this.stats[step];\n\n if (stats && (stats.started !== count || stats.finished !== count)) {\n callback(\n new Error(\n `Data missing: sent ${this.stats[step].count} ${step}, received ${stats.started} and saved ${stats.finished} ${step}`\n )\n );\n }\n\n callback(error);\n },\n\n async write(chunk, _encoding, callback) {\n const startError = await startTransferOnce();\n if (startError) {\n return callback(startError);\n }\n\n // Flush a batch that has sat long enough before growing it further (bounded latency).\n if (batch.length > 0 && Date.now() - batchStartedAt >= STREAM_STEP_MAX_BATCH_AGE_MS) {\n const staleError = await flushBatch();\n if (staleError) {\n return callback(staleError);\n }\n }\n\n batch.push(chunk);\n if (batch.length === 1) {\n batchStartedAt = Date.now();\n }\n\n if (shouldFlushBatchAfterPush()) {\n const streamError = await flushBatch();\n if (streamError) {\n return callback(streamError);\n }\n }\n\n callback();\n },\n });\n }\n\n #reportInfo(message: string) {\n this.#diagnostics?.report({\n details: {\n createdAt: new Date(),\n message,\n origin: 'remote-destination-provider',\n },\n kind: 'info',\n });\n }\n\n #reportWarning(message: string) {\n this.#diagnostics?.report({\n details: {\n createdAt: new Date(),\n message,\n origin: 'remote-destination-provider',\n },\n kind: 'warning',\n });\n }\n\n async bootstrap(diagnostics?: IDiagnosticReporter): Promise<void> {\n this.#diagnostics = diagnostics;\n const { url, auth } = this.options;\n const validProtocols = ['https:', 'http:'];\n\n let ws: WebSocket;\n\n if (!validProtocols.includes(url.protocol)) {\n throw new ProviderValidationError(`Invalid protocol \"${url.protocol}\"`, {\n check: 'url',\n details: {\n protocol: url.protocol,\n validProtocols,\n },\n });\n }\n const wsProtocol = url.protocol === 'https:' ? 'wss:' : 'ws:';\n const wsUrl = `${wsProtocol}//${url.host}${trimTrailingSlash(\n url.pathname\n )}${TRANSFER_PATH}/push`;\n\n this.#reportInfo('establishing websocket connection');\n // No auth defined, trying public access for transfer\n if (!auth) {\n ws = await connectToWebsocket(wsUrl, undefined, this.#diagnostics);\n }\n\n // Common token auth, this should be the main auth method\n else if (auth.type === 'token') {\n const headers = { Authorization: `Bearer ${auth.token}` };\n ws = await connectToWebsocket(wsUrl, { headers }, this.#diagnostics);\n }\n\n // Invalid auth method provided\n else {\n throw new ProviderValidationError('Auth method not available', {\n check: 'auth.type',\n details: {\n auth: auth.type,\n },\n });\n }\n\n this.#reportInfo('established websocket connection');\n\n this.ws = ws;\n const { retryMessageOptions } = this.options;\n\n this.#reportInfo('creating dispatcher');\n this.dispatcher = createDispatcher(this.ws, retryMessageOptions, (message: string) =>\n this.#reportInfo(message)\n );\n this.#reportInfo('created dispatcher');\n\n this.#reportInfo('initialize transfer');\n this.transferID = await this.initTransfer();\n this.#reportInfo(`initialized transfer ${this.transferID}`);\n\n this.dispatcher.setTransferProperties({ id: this.transferID, kind: 'push' });\n\n await this.dispatcher.dispatchTransferAction('bootstrap');\n }\n\n async close() {\n // Gracefully close the remote transfer process\n if (this.transferID && this.dispatcher) {\n await this.dispatcher.dispatchTransferAction('close');\n\n await this.dispatcher.dispatchCommand({\n command: 'end',\n params: { transferID: this.transferID },\n });\n }\n\n await new Promise<void>((resolve) => {\n const { ws } = this;\n\n if (!ws || ws.CLOSED) {\n resolve();\n return;\n }\n\n ws.on('close', () => resolve()).close();\n });\n }\n\n getMetadata() {\n return this.dispatcher?.dispatchTransferAction<IMetadata>('getMetadata') ?? null;\n }\n\n async beforeTransfer() {\n this.options.onTransferPhase?.(\n 'Remote: waiting for server to clear data and prepare destination…'\n );\n await this.dispatcher?.dispatchTransferAction('beforeTransfer');\n }\n\n async rollback() {\n await this.dispatcher?.dispatchTransferAction('rollback');\n }\n\n getSchemas() {\n if (!this.dispatcher) {\n return Promise.resolve(null);\n }\n\n return this.dispatcher.dispatchTransferAction<Utils.String.Dict<Struct.Schema>>('getSchemas');\n }\n\n createEntitiesWriteStream(): Writable {\n return this.#writeStream('entities');\n }\n\n createLinksWriteStream(): Writable {\n return this.#writeStream('links');\n }\n\n createConfigurationWriteStream(): Writable {\n return this.#writeStream('configuration');\n }\n\n createAssetsWriteStream(): Writable | Promise<Writable> {\n let batch: Client.TransferAssetFlow[] = [];\n let hasStarted = false;\n const verifyChecksums = this.#checksumsEnabled;\n const encodeAssetChunk =\n this.#assetEncoding === 'base64'\n ? createTransferAssetStreamChunk\n : createTransferAssetStreamChunkLegacy;\n\n const batchSize = 1024 * 1024; // 1MB;\n const batchLength = () => {\n return batch.reduce((acc, chunk) => acc + transferAssetStreamChunkByteLength(chunk), 0);\n };\n const startAssetsTransferOnce = this.#startStepOnce('assets');\n\n const flush = async () => {\n const streamError = await this.#streamStep('assets', batch);\n batch = [];\n return streamError;\n };\n\n const safePush = async (chunk: Client.TransferAssetFlow) => {\n batch.push(chunk);\n\n if (batchLength() >= batchSize) {\n const streamError = await flush();\n if (streamError) {\n throw streamError;\n }\n }\n };\n\n return new Writable({\n objectMode: true,\n final: async (callback) => {\n if (batch.length > 0) {\n await flush();\n }\n\n if (hasStarted) {\n const { error: endStepError } = await this.#endStep('assets');\n\n if (endStepError) {\n return callback(endStepError);\n }\n }\n\n return callback(null);\n },\n\n async write(asset: IAsset, _encoding, callback) {\n const startError = await startAssetsTransferOnce();\n if (startError) {\n return callback(startError);\n }\n\n hasStarted = true;\n\n const assetID = randomUUID();\n const { filename, filepath, stats, stream, metadata } = asset;\n const checksumHash = verifyChecksums ? createHash('sha256') : undefined;\n\n try {\n await safePush({\n action: 'start',\n assetID,\n data: { filename, filepath, stats, metadata },\n });\n\n for await (const chunk of stream) {\n checksumHash?.update(chunk);\n await safePush(encodeAssetChunk(assetID, chunk));\n }\n\n await safePush({\n action: 'end',\n assetID,\n ...(checksumHash\n ? { checksum: { algorithm: 'sha256' as const, value: checksumHash.digest('hex') } }\n : {}),\n });\n\n callback();\n } catch (error) {\n callback(error instanceof Error ? error : new Error(String(error)));\n }\n },\n });\n }\n}\n\nexport const createRemoteStrapiDestinationProvider = (\n options: IRemoteStrapiDestinationProviderOptions\n) => {\n return new RemoteStrapiDestinationProvider(options);\n};\n"],"names":["jsonLength","obj","Buffer","byteLength","JSON","stringify","STREAM_STEP_MAX_BATCH_BYTES","STREAM_STEP_MAX_BATCH_ITEMS","STREAM_STEP_MAX_BATCH_AGE_MS","RemoteStrapiDestinationProvider","resetStats","stats","assets","count","entities","links","configuration","initTransfer","strategy","restore","options","wantsChecksums","verifyChecksums","query","dispatcher","dispatchCommand","command","params","transfer","checksums","assetEncoding","res","transferID","ProviderTransferError","bootstrap","diagnostics","url","auth","validProtocols","ws","includes","protocol","ProviderValidationError","check","details","wsProtocol","wsUrl","host","trimTrailingSlash","pathname","TRANSFER_PATH","connectToWebsocket","undefined","type","headers","Authorization","token","retryMessageOptions","createDispatcher","message","setTransferProperties","id","kind","dispatchTransferAction","close","Promise","resolve","CLOSED","on","getMetadata","beforeTransfer","onTransferPhase","rollback","getSchemas","createEntitiesWriteStream","createLinksWriteStream","createConfigurationWriteStream","createAssetsWriteStream","batch","hasStarted","encodeAssetChunk","createTransferAssetStreamChunk","createTransferAssetStreamChunkLegacy","batchSize","batchLength","reduce","acc","chunk","transferAssetStreamChunkByteLength","startAssetsTransferOnce","flush","streamError","safePush","push","Writable","objectMode","final","callback","length","error","endStepError","write","asset","_encoding","startError","assetID","randomUUID","filename","filepath","stream","metadata","checksumHash","createHash","action","data","update","checksum","algorithm","value","digest","Error","String","name","stage","once","step","dispatchTransferStep","e","assetMessage","filter","startTransferOnce","batchStartedAt","flushBatch","payload","shouldFlushBatchAfterPush","Date","now","started","finished","staleError","report","createdAt","origin","createRemoteStrapiDestinationProvider"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../../src/strapi/providers/remote-destination/index.ts"],"sourcesContent":["import { createHash, randomUUID } from 'crypto';\nimport { Writable } from 'stream';\nimport { WebSocket } from 'ws';\nimport { once } from 'lodash';\nimport type { Struct, Utils } from '@strapi/types';\n\nimport { createDispatcher, connectToWebsocket, trimTrailingSlash } from '../utils';\n\nimport type {\n IDestinationProvider,\n IMetadata,\n ProviderType,\n IAsset,\n TransferStage,\n Protocol,\n} from '../../../types';\nimport type { IDiagnosticReporter } from '../../../utils/diagnostic';\nimport type { Client, Server, Auth } from '../../../types/remote/protocol';\nimport type { ILocalStrapiDestinationProviderOptions } from '../local-destination';\nimport { TRANSFER_PATH } from '../../remote/constants';\nimport { ProviderTransferError, ProviderValidationError } from '../../../errors/providers';\nimport {\n createTransferAssetStreamChunk,\n createTransferAssetStreamChunkLegacy,\n transferAssetStreamChunkByteLength,\n} from '../../../utils/transfer-asset-chunk';\n\nexport interface IRemoteStrapiDestinationProviderOptions extends Pick<\n ILocalStrapiDestinationProviderOptions,\n 'restore' | 'strategy' | 'onTransferPhase'\n> {\n url: URL; // the url of the remote Strapi admin\n auth?: Auth.ITransferTokenAuth;\n retryMessageOptions?: {\n retryMessageTimeout: number; // milliseconds to wait for a response from a message\n retryMessageMaxRetries: number; // max number of retries for a message before aborting transfer\n };\n /** Include per-asset stream checksums and require peers to validate on receive. */\n verifyChecksums?: boolean;\n}\n\nconst jsonLength = (obj: object) => Buffer.byteLength(JSON.stringify(obj));\n\n/**\n * Default batching for entities / links / configuration over WebSocket push.\n *\n * Goals: (1) enough payload per round-trip to stay efficient on large transfers,\n * (2) small enough per message that the remote can process and ack without multi-minute stalls,\n * (3) bounded gap between engine progress and the wire (see item cap + age).\n *\n * These are fixed defaults (not tuned per dataset) so behavior is predictable everywhere.\n */\nconst STREAM_STEP_MAX_BATCH_BYTES = 512 * 1024;\n\n/** Caps parallel work per message and how far UI count can lead the network for tiny rows. */\nconst STREAM_STEP_MAX_BATCH_ITEMS = 100;\n\n/**\n * If the first row in the current batch has waited this long, flush before appending more.\n * Helps mixed-size streams (e.g. occasional large rows) without relying on tiny byte caps alone.\n */\nconst STREAM_STEP_MAX_BATCH_AGE_MS = 450;\n\nclass RemoteStrapiDestinationProvider implements IDestinationProvider {\n name = 'destination::remote-strapi';\n\n type: ProviderType = 'destination';\n\n options: IRemoteStrapiDestinationProviderOptions;\n\n ws: WebSocket | null;\n\n dispatcher: ReturnType<typeof createDispatcher> | null;\n\n transferID: string | null;\n\n stats!: { [TStage in Exclude<TransferStage, 'schemas'>]: { count: number } };\n\n #diagnostics?: IDiagnosticReporter;\n\n #checksumsEnabled = false;\n\n /**\n * Wire format for asset chunks. `'base64'` is the compact default introduced in #23479; remotes\n * that predate that PR do `Buffer.from(item.data.data)` directly and need the legacy\n * `{ type: 'Buffer', data: number[] }` shape instead. Set by init negotiation.\n */\n #assetEncoding: 'base64' | 'legacy-buffer-json' = 'base64';\n\n constructor(options: IRemoteStrapiDestinationProviderOptions) {\n this.options = options;\n this.ws = null;\n this.dispatcher = null;\n this.transferID = null;\n this.#checksumsEnabled = options.verifyChecksums === true;\n\n this.resetStats();\n }\n\n private resetStats() {\n this.stats = {\n assets: { count: 0 },\n entities: { count: 0 },\n links: { count: 0 },\n configuration: { count: 0 },\n };\n }\n\n async initTransfer(): Promise<string> {\n const { strategy, restore } = this.options;\n const wantsChecksums = this.options.verifyChecksums === true;\n\n const query = this.dispatcher?.dispatchCommand({\n command: 'init',\n params: {\n options: { strategy, restore },\n transfer: 'push',\n ...(wantsChecksums ? { checksums: true } : {}),\n assetEncoding: 'base64',\n },\n });\n\n const res = (await query) as\n | (Server.Payload<Server.InitMessage> & {\n checksums?: boolean;\n assetEncoding?: 'base64';\n })\n | null;\n if (!res?.transferID) {\n throw new ProviderTransferError('Init failed, invalid response from the server');\n }\n this.#checksumsEnabled = wantsChecksums && res.checksums === true;\n if (wantsChecksums && res.checksums !== true) {\n this.#reportWarning(\n '[Data transfer][push] Checksums were requested but the remote does not support checksum negotiation; continuing without checksum validation.'\n );\n }\n\n // A remote that predates #23479 silently drops the `assetEncoding` field instead of echoing\n // it. Falling back to the legacy Buffer JSON shape keeps small pushes working against those\n // remotes; large pushes may still OOM the remote during `JSON.parse` because that shape\n // allocates the full byte array — emit a warning so the user understands the trade-off.\n if (res.assetEncoding === 'base64') {\n this.#assetEncoding = 'base64';\n } else {\n this.#assetEncoding = 'legacy-buffer-json';\n this.#reportWarning(\n '[Data transfer][push] Remote does not support the compact base64 asset-chunk format; ' +\n 'falling back to legacy Buffer JSON. Large files may cause out-of-memory errors on the remote — ' +\n 'upgrade the remote Strapi to pick up PR #23479 to use the memory-bounded wire format.'\n );\n }\n\n this.resetStats();\n\n return res.transferID;\n }\n\n #startStepOnce(stage: Client.TransferPushStep) {\n return once(() => this.#startStep(stage));\n }\n\n async #startStep<T extends Client.TransferPushStep>(step: T) {\n try {\n await this.dispatcher?.dispatchTransferStep({ action: 'start', step });\n } catch (e) {\n if (e instanceof Error) {\n return e;\n }\n\n if (typeof e === 'string') {\n return new ProviderTransferError(e);\n }\n\n return new ProviderTransferError('Unexpected error');\n }\n\n this.stats[step] = { count: 0 };\n\n return null;\n }\n\n async #endStep<T extends Client.TransferPushStep>(step: T) {\n try {\n const res = await this.dispatcher?.dispatchTransferStep<{\n ok: boolean;\n stats: Protocol.Client.Stats;\n }>({\n action: 'end',\n step,\n });\n\n return { stats: res?.stats ?? null, error: null };\n } catch (e) {\n if (e instanceof Error) {\n return { stats: null, error: e };\n }\n\n if (typeof e === 'string') {\n return { stats: null, error: new ProviderTransferError(e) };\n }\n\n return { stats: null, error: new ProviderTransferError('Unexpected error') };\n }\n }\n\n async #streamStep<T extends Client.TransferPushStep>(\n step: T,\n message: Client.GetTransferPushStreamData<T>\n ) {\n try {\n if (step === 'assets') {\n const assetMessage = message as Protocol.Client.TransferAssetFlow[];\n this.stats[step].count += assetMessage.filter((data) => data.action === 'start').length;\n } else {\n this.stats[step].count += message.length;\n }\n\n await this.dispatcher?.dispatchTransferStep({ action: 'stream', step, data: message });\n } catch (e) {\n if (e instanceof Error) {\n return e;\n }\n\n if (typeof e === 'string') {\n return new ProviderTransferError(e);\n }\n\n return new ProviderTransferError('Unexpected error');\n }\n\n return null;\n }\n\n #writeStream(step: Exclude<Client.TransferPushStep, 'assets'>): Writable {\n type Step = typeof step;\n\n const startTransferOnce = this.#startStepOnce(step);\n\n let batch = [] as Client.GetTransferPushStreamData<Step>;\n let batchStartedAt = 0;\n\n const batchLength = () => jsonLength(batch);\n\n const flushBatch = async (): Promise<Error | null> => {\n if (batch.length === 0) {\n return null;\n }\n const payload = batch;\n batch = [];\n batchStartedAt = 0;\n return this.#streamStep(step, payload);\n };\n\n const shouldFlushBatchAfterPush = () => {\n if (batch.length === 0) {\n return false;\n }\n return (\n batchLength() >= STREAM_STEP_MAX_BATCH_BYTES ||\n batch.length >= STREAM_STEP_MAX_BATCH_ITEMS ||\n Date.now() - batchStartedAt >= STREAM_STEP_MAX_BATCH_AGE_MS\n );\n };\n\n return new Writable({\n objectMode: true,\n\n final: async (callback) => {\n if (batch.length > 0) {\n const streamError = await flushBatch();\n\n if (streamError) {\n return callback(streamError);\n }\n }\n const { error, stats } = await this.#endStep(step);\n\n const { count } = this.stats[step];\n\n if (stats && (stats.started !== count || stats.finished !== count)) {\n callback(\n new Error(\n `Data missing: sent ${this.stats[step].count} ${step}, received ${stats.started} and saved ${stats.finished} ${step}`\n )\n );\n }\n\n callback(error);\n },\n\n async write(chunk, _encoding, callback) {\n const startError = await startTransferOnce();\n if (startError) {\n return callback(startError);\n }\n\n // Flush a batch that has sat long enough before growing it further (bounded latency).\n if (batch.length > 0 && Date.now() - batchStartedAt >= STREAM_STEP_MAX_BATCH_AGE_MS) {\n const staleError = await flushBatch();\n if (staleError) {\n return callback(staleError);\n }\n }\n\n batch.push(chunk);\n if (batch.length === 1) {\n batchStartedAt = Date.now();\n }\n\n if (shouldFlushBatchAfterPush()) {\n const streamError = await flushBatch();\n if (streamError) {\n return callback(streamError);\n }\n }\n\n callback();\n },\n });\n }\n\n #reportInfo(message: string) {\n this.#diagnostics?.report({\n details: {\n createdAt: new Date(),\n message,\n origin: 'remote-destination-provider',\n },\n kind: 'info',\n });\n }\n\n #reportWarning(message: string) {\n this.#diagnostics?.report({\n details: {\n createdAt: new Date(),\n message,\n origin: 'remote-destination-provider',\n },\n kind: 'warning',\n });\n }\n\n async bootstrap(diagnostics?: IDiagnosticReporter): Promise<void> {\n this.#diagnostics = diagnostics;\n const { url, auth } = this.options;\n const validProtocols = ['https:', 'http:'];\n\n let ws: WebSocket;\n\n if (!validProtocols.includes(url.protocol)) {\n throw new ProviderValidationError(`Invalid protocol \"${url.protocol}\"`, {\n check: 'url',\n details: {\n protocol: url.protocol,\n validProtocols,\n },\n });\n }\n const wsProtocol = url.protocol === 'https:' ? 'wss:' : 'ws:';\n const wsUrl = `${wsProtocol}//${url.host}${trimTrailingSlash(\n url.pathname\n )}${TRANSFER_PATH}/push`;\n\n this.#reportInfo('establishing websocket connection');\n // No auth defined, trying public access for transfer\n if (!auth) {\n ws = await connectToWebsocket(wsUrl, undefined, this.#diagnostics);\n }\n\n // Common token auth, this should be the main auth method\n else if (auth.type === 'token') {\n const headers = { Authorization: `Bearer ${auth.token}` };\n ws = await connectToWebsocket(wsUrl, { headers }, this.#diagnostics);\n }\n\n // Invalid auth method provided\n else {\n throw new ProviderValidationError('Auth method not available', {\n check: 'auth.type',\n details: {\n auth: auth.type,\n },\n });\n }\n\n this.#reportInfo('established websocket connection');\n\n this.ws = ws;\n const { retryMessageOptions } = this.options;\n\n this.#reportInfo('creating dispatcher');\n this.dispatcher = createDispatcher(this.ws, retryMessageOptions, (message: string) =>\n this.#reportInfo(message)\n );\n this.#reportInfo('created dispatcher');\n\n this.#reportInfo('initialize transfer');\n this.transferID = await this.initTransfer();\n this.#reportInfo(`initialized transfer ${this.transferID}`);\n\n this.dispatcher.setTransferProperties({ id: this.transferID, kind: 'push' });\n\n await this.dispatcher.dispatchTransferAction('bootstrap');\n }\n\n async close() {\n // Gracefully close the remote transfer process\n if (this.transferID && this.dispatcher) {\n await this.dispatcher.dispatchTransferAction('close');\n\n await this.dispatcher.dispatchCommand({\n command: 'end',\n params: { transferID: this.transferID },\n });\n }\n\n await new Promise<void>((resolve) => {\n const { ws } = this;\n\n if (!ws || ws.CLOSED) {\n resolve();\n return;\n }\n\n ws.on('close', () => resolve()).close();\n });\n }\n\n getMetadata() {\n return this.dispatcher?.dispatchTransferAction<IMetadata>('getMetadata') ?? null;\n }\n\n async beforeTransfer() {\n this.options.onTransferPhase?.(\n 'Remote: waiting for server to clear data and prepare destination…'\n );\n await this.dispatcher?.dispatchTransferAction('beforeTransfer');\n }\n\n async rollback() {\n await this.dispatcher?.dispatchTransferAction('rollback');\n }\n\n getSchemas() {\n if (!this.dispatcher) {\n return Promise.resolve(null);\n }\n\n return this.dispatcher.dispatchTransferAction<Utils.String.Dict<Struct.Schema>>('getSchemas');\n }\n\n createEntitiesWriteStream(): Writable {\n return this.#writeStream('entities');\n }\n\n createLinksWriteStream(): Writable {\n return this.#writeStream('links');\n }\n\n createConfigurationWriteStream(): Writable {\n return this.#writeStream('configuration');\n }\n\n createAssetsWriteStream(): Writable | Promise<Writable> {\n let batch: Client.TransferAssetFlow[] = [];\n let hasStarted = false;\n const verifyChecksums = this.#checksumsEnabled;\n const encodeAssetChunk =\n this.#assetEncoding === 'base64'\n ? createTransferAssetStreamChunk\n : createTransferAssetStreamChunkLegacy;\n\n const batchSize = 1024 * 1024; // 1MB;\n const batchLength = () => {\n return batch.reduce((acc, chunk) => acc + transferAssetStreamChunkByteLength(chunk), 0);\n };\n const startAssetsTransferOnce = this.#startStepOnce('assets');\n\n const flush = async () => {\n const streamError = await this.#streamStep('assets', batch);\n batch = [];\n return streamError;\n };\n\n const safePush = async (chunk: Client.TransferAssetFlow) => {\n batch.push(chunk);\n\n if (batchLength() >= batchSize) {\n const streamError = await flush();\n if (streamError) {\n throw streamError;\n }\n }\n };\n\n return new Writable({\n objectMode: true,\n final: async (callback) => {\n if (batch.length > 0) {\n await flush();\n }\n\n if (hasStarted) {\n const { error: endStepError } = await this.#endStep('assets');\n\n if (endStepError) {\n return callback(endStepError);\n }\n }\n\n return callback(null);\n },\n\n async write(asset: IAsset, _encoding, callback) {\n const startError = await startAssetsTransferOnce();\n if (startError) {\n return callback(startError);\n }\n\n hasStarted = true;\n\n const assetID = randomUUID();\n const { filename, filepath, stats, stream, metadata } = asset;\n const checksumHash = verifyChecksums ? createHash('sha256') : undefined;\n\n try {\n await safePush({\n action: 'start',\n assetID,\n data: { filename, filepath, stats, metadata },\n });\n\n for await (const chunk of stream) {\n checksumHash?.update(chunk);\n await safePush(encodeAssetChunk(assetID, chunk));\n }\n\n await safePush({\n action: 'end',\n assetID,\n ...(checksumHash\n ? { checksum: { algorithm: 'sha256' as const, value: checksumHash.digest('hex') } }\n : {}),\n });\n\n callback();\n } catch (error) {\n callback(error instanceof Error ? error : new Error(String(error)));\n }\n },\n });\n }\n}\n\nexport const createRemoteStrapiDestinationProvider = (\n options: IRemoteStrapiDestinationProviderOptions\n) => {\n return new RemoteStrapiDestinationProvider(options);\n};\n"],"names":["jsonLength","obj","Buffer","byteLength","JSON","stringify","STREAM_STEP_MAX_BATCH_BYTES","STREAM_STEP_MAX_BATCH_ITEMS","STREAM_STEP_MAX_BATCH_AGE_MS","RemoteStrapiDestinationProvider","resetStats","stats","assets","count","entities","links","configuration","initTransfer","strategy","restore","options","wantsChecksums","verifyChecksums","query","dispatcher","dispatchCommand","command","params","transfer","checksums","assetEncoding","res","transferID","ProviderTransferError","bootstrap","diagnostics","url","auth","validProtocols","ws","includes","protocol","ProviderValidationError","check","details","wsProtocol","wsUrl","host","trimTrailingSlash","pathname","TRANSFER_PATH","connectToWebsocket","undefined","type","headers","Authorization","token","retryMessageOptions","createDispatcher","message","setTransferProperties","id","kind","dispatchTransferAction","close","Promise","resolve","CLOSED","on","getMetadata","beforeTransfer","onTransferPhase","rollback","getSchemas","createEntitiesWriteStream","createLinksWriteStream","createConfigurationWriteStream","createAssetsWriteStream","batch","hasStarted","encodeAssetChunk","createTransferAssetStreamChunk","createTransferAssetStreamChunkLegacy","batchSize","batchLength","reduce","acc","chunk","transferAssetStreamChunkByteLength","startAssetsTransferOnce","flush","streamError","safePush","push","Writable","objectMode","final","callback","length","error","endStepError","write","asset","_encoding","startError","assetID","randomUUID","filename","filepath","stream","metadata","checksumHash","createHash","action","data","update","checksum","algorithm","value","digest","Error","String","name","stage","once","step","dispatchTransferStep","e","assetMessage","filter","startTransferOnce","batchStartedAt","flushBatch","payload","shouldFlushBatchAfterPush","Date","now","started","finished","staleError","report","createdAt","origin","createRemoteStrapiDestinationProvider"],"mappings":";;;;;;;;;;;;;;;;;;AAyCA,MAAMA,UAAAA,GAAa,CAACC,GAAAA,GAAgBC,MAAAA,CAAOC,UAAU,CAACC,IAAAA,CAAKC,SAAS,CAACJ,GAAAA,CAAAA,CAAAA;AAErE;;;;;;;;IASA,MAAMK,8BAA8B,GAAA,GAAM,IAAA;AAE1C,+FACA,MAAMC,2BAAAA,GAA8B,GAAA;AAEpC;;;AAGC,IACD,MAAMC,4BAAAA,GAA+B,GAAA;AAiBnC,IAAA,YAAA,iBAAA,8BAAA,CAAA,cAAA,CAAA,EAEA,iBAAA,iBAAA,8BAAA,CAAA,mBAAA,CAAA;;;;AAMC,MACD,iFAuEA,cAAA,iBAAA,8BAAA,CAAA,gBAAA,CAAA,EAIM,UAAA,iBAAA,8BAAA,CAAA,YAAA,CAAA,EAoBA,QAAA,iBAAA,8BAAA,CAAA,UAAA,CAAA,EAwBA,WAAA,iBAAA,8BAAA,CAAA,aAAA,CAAA,EA4BN,6EAwFA,WAAA,iBAAA,8BAAA,CAAA,aAAA,CAAA,EAWA,cAAA,iBAAA,8BAAA,CAAA,gBAAA,CAAA;AA9QF,MAAMC,+BAAAA,CAAAA;IAoCIC,UAAAA,GAAa;QACnB,IAAI,CAACC,KAAK,GAAG;YACXC,MAAAA,EAAQ;gBAAEC,KAAAA,EAAO;AAAE,aAAA;YACnBC,QAAAA,EAAU;gBAAED,KAAAA,EAAO;AAAE,aAAA;YACrBE,KAAAA,EAAO;gBAAEF,KAAAA,EAAO;AAAE,aAAA;YAClBG,aAAAA,EAAe;gBAAEH,KAAAA,EAAO;AAAE;AAC5B,SAAA;AACF,IAAA;AAEA,IAAA,MAAMI,YAAAA,GAAgC;QACpC,MAAM,EAAEC,QAAQ,EAAEC,OAAO,EAAE,GAAG,IAAI,CAACC,OAAO;AAC1C,QAAA,MAAMC,iBAAiB,IAAI,CAACD,OAAO,CAACE,eAAe,KAAK,IAAA;AAExD,QAAA,MAAMC,KAAAA,GAAQ,IAAI,CAACC,UAAU,EAAEC,eAAAA,CAAgB;YAC7CC,OAAAA,EAAS,MAAA;YACTC,MAAAA,EAAQ;gBACNP,OAAAA,EAAS;AAAEF,oBAAAA,QAAAA;AAAUC,oBAAAA;AAAQ,iBAAA;gBAC7BS,QAAAA,EAAU,MAAA;AACV,gBAAA,GAAIP,cAAAA,GAAiB;oBAAEQ,SAAAA,EAAW;AAAK,iBAAA,GAAI,EAAE;gBAC7CC,aAAAA,EAAe;AACjB;AACF,SAAA,CAAA;AAEA,QAAA,MAAMC,MAAO,MAAMR,KAAAA;QAMnB,IAAI,CAACQ,KAAKC,UAAAA,EAAY;AACpB,YAAA,MAAM,IAAIC,qBAAAA,CAAsB,+CAAA,CAAA;AAClC,QAAA;AACA,QAAA,+BAAA,CAAA,IAAI,EAAC,iBAAA,CAAA,CAAA,qBAAoBZ,cAAAA,IAAkBU,GAAAA,CAAIF,SAAS,KAAK,IAAA;AAC7D,QAAA,IAAIR,cAAAA,IAAkBU,GAAAA,CAAIF,SAAS,KAAK,IAAA,EAAM;YAC5C,+BAAA,CAAA,IAAI,EAAC,cAAA,CAAA,CAAA,cAAA,CAAA,CACH,8IAAA,CAAA;AAEJ,QAAA;;;;;QAMA,IAAIE,GAAAA,CAAID,aAAa,KAAK,QAAA,EAAU;YAClC,+BAAA,CAAA,IAAI,EAAC,cAAA,CAAA,CAAA,cAAA,CAAA,GAAiB,QAAA;QACxB,CAAA,MAAO;YACL,+BAAA,CAAA,IAAI,EAAC,cAAA,CAAA,CAAA,cAAA,CAAA,GAAiB,oBAAA;AACtB,YAAA,+BAAA,CAAA,IAAI,EAAC,cAAA,CAAA,CAAA,cAAA,CAAA,CACH,0FACE,iGAAA,GACA,uFAAA,CAAA;AAEN,QAAA;AAEA,QAAA,IAAI,CAACpB,UAAU,EAAA;AAEf,QAAA,OAAOqB,IAAIC,UAAU;AACvB,IAAA;IA4LA,MAAME,SAAAA,CAAUC,WAAiC,EAAiB;QAChE,+BAAA,CAAA,IAAI,EAAC,YAAA,CAAA,CAAA,YAAA,CAAA,GAAeA,WAAAA;QACpB,MAAM,EAAEC,GAAG,EAAEC,IAAI,EAAE,GAAG,IAAI,CAACjB,OAAO;AAClC,QAAA,MAAMkB,cAAAA,GAAiB;AAAC,YAAA,QAAA;AAAU,YAAA;AAAQ,SAAA;QAE1C,IAAIC,EAAAA;AAEJ,QAAA,IAAI,CAACD,cAAAA,CAAeE,QAAQ,CAACJ,GAAAA,CAAIK,QAAQ,CAAA,EAAG;YAC1C,MAAM,IAAIC,uBAAAA,CAAwB,CAAC,kBAAkB,EAAEN,IAAIK,QAAQ,CAAC,CAAC,CAAC,EAAE;gBACtEE,KAAAA,EAAO,KAAA;gBACPC,OAAAA,EAAS;AACPH,oBAAAA,QAAAA,EAAUL,IAAIK,QAAQ;AACtBH,oBAAAA;AACF;AACF,aAAA,CAAA;AACF,QAAA;AACA,QAAA,MAAMO,UAAAA,GAAaT,GAAAA,CAAIK,QAAQ,KAAK,WAAW,MAAA,GAAS,KAAA;AACxD,QAAA,MAAMK,KAAAA,GAAQ,CAAA,EAAGD,UAAAA,CAAW,EAAE,EAAET,GAAAA,CAAIW,IAAI,CAAA,EAAGC,iBAAAA,CACzCZ,GAAAA,CAAIa,QAAQ,CAAA,CAAA,EACVC,aAAAA,CAAc,KAAK,CAAC;QAExB,+BAAA,CAAA,IAAI,EAAC,WAAA,CAAA,CAAA,WAAA,CAAA,CAAY,mCAAA,CAAA;;AAEjB,QAAA,IAAI,CAACb,IAAAA,EAAM;AACTE,YAAAA,EAAAA,GAAK,MAAMY,kBAAAA,CAAmBL,KAAAA,EAAOM,WAAW,+BAAA,CAAA,IAAI,EAAC,YAAA,CAAA,CAAA,YAAA,CAAA,CAAA;AACvD,QAAA,CAAA,MAGK,IAAIf,IAAAA,CAAKgB,IAAI,KAAK,OAAA,EAAS;AAC9B,YAAA,MAAMC,OAAAA,GAAU;AAAEC,gBAAAA,aAAAA,EAAe,CAAC,OAAO,EAAElB,IAAAA,CAAKmB,KAAK,CAAA;AAAG,aAAA;YACxDjB,EAAAA,GAAK,MAAMY,mBAAmBL,KAAAA,EAAO;AAAEQ,gBAAAA;aAAQ,EAAG,+BAAA,CAAA,IAAI,EAAC,YAAA,CAAA,CAAA,YAAA,CAAA,CAAA;QACzD,CAAA,MAGK;YACH,MAAM,IAAIZ,wBAAwB,2BAAA,EAA6B;gBAC7DC,KAAAA,EAAO,WAAA;gBACPC,OAAAA,EAAS;AACPP,oBAAAA,IAAAA,EAAMA,KAAKgB;AACb;AACF,aAAA,CAAA;AACF,QAAA;QAEA,+BAAA,CAAA,IAAI,EAAC,WAAA,CAAA,CAAA,WAAA,CAAA,CAAY,kCAAA,CAAA;QAEjB,IAAI,CAACd,EAAE,GAAGA,EAAAA;AACV,QAAA,MAAM,EAAEkB,mBAAmB,EAAE,GAAG,IAAI,CAACrC,OAAO;QAE5C,+BAAA,CAAA,IAAI,EAAC,WAAA,CAAA,CAAA,WAAA,CAAA,CAAY,qBAAA,CAAA;AACjB,QAAA,IAAI,CAACI,UAAU,GAAGkC,gBAAAA,CAAiB,IAAI,CAACnB,EAAE,EAAEkB,mBAAAA,EAAqB,CAACE,OAAAA,GAChE,+BAAA,CAAA,IAAI,EAAC,aAAA,WAAA,CAAA,CAAYA,OAAAA,CAAAA,CAAAA;QAEnB,+BAAA,CAAA,IAAI,EAAC,WAAA,CAAA,CAAA,WAAA,CAAA,CAAY,oBAAA,CAAA;QAEjB,+BAAA,CAAA,IAAI,EAAC,WAAA,CAAA,CAAA,WAAA,CAAA,CAAY,qBAAA,CAAA;AACjB,QAAA,IAAI,CAAC3B,UAAU,GAAG,MAAM,IAAI,CAACf,YAAY,EAAA;QACzC,+BAAA,CAAA,IAAI,EAAC,WAAA,CAAA,CAAA,WAAA,CAAA,CAAY,CAAC,qBAAqB,EAAE,IAAI,CAACe,UAAU,CAAA,CAAE,CAAA;AAE1D,QAAA,IAAI,CAACR,UAAU,CAACoC,qBAAqB,CAAC;YAAEC,EAAAA,EAAI,IAAI,CAAC7B,UAAU;YAAE8B,IAAAA,EAAM;AAAO,SAAA,CAAA;AAE1E,QAAA,MAAM,IAAI,CAACtC,UAAU,CAACuC,sBAAsB,CAAC,WAAA,CAAA;AAC/C,IAAA;AAEA,IAAA,MAAMC,KAAAA,GAAQ;;AAEZ,QAAA,IAAI,IAAI,CAAChC,UAAU,IAAI,IAAI,CAACR,UAAU,EAAE;AACtC,YAAA,MAAM,IAAI,CAACA,UAAU,CAACuC,sBAAsB,CAAC,OAAA,CAAA;AAE7C,YAAA,MAAM,IAAI,CAACvC,UAAU,CAACC,eAAe,CAAC;gBACpCC,OAAAA,EAAS,KAAA;gBACTC,MAAAA,EAAQ;oBAAEK,UAAAA,EAAY,IAAI,CAACA;AAAW;AACxC,aAAA,CAAA;AACF,QAAA;QAEA,MAAM,IAAIiC,QAAc,CAACC,OAAAA,GAAAA;AACvB,YAAA,MAAM,EAAE3B,EAAE,EAAE,GAAG,IAAI;AAEnB,YAAA,IAAI,CAACA,EAAAA,IAAMA,EAAAA,CAAG4B,MAAM,EAAE;AACpBD,gBAAAA,OAAAA,EAAAA;AACA,gBAAA;AACF,YAAA;AAEA3B,YAAAA,EAAAA,CAAG6B,EAAE,CAAC,OAAA,EAAS,IAAMF,WAAWF,KAAK,EAAA;AACvC,QAAA,CAAA,CAAA;AACF,IAAA;IAEAK,WAAAA,GAAc;AACZ,QAAA,OAAO,IAAI,CAAC7C,UAAU,EAAEuC,uBAAkC,aAAA,CAAA,IAAkB,IAAA;AAC9E,IAAA;AAEA,IAAA,MAAMO,cAAAA,GAAiB;AACrB,QAAA,IAAI,CAAClD,OAAO,CAACmD,eAAe,GAC1B,mEAAA,CAAA;AAEF,QAAA,MAAM,IAAI,CAAC/C,UAAU,EAAEuC,sBAAAA,CAAuB,gBAAA,CAAA;AAChD,IAAA;AAEA,IAAA,MAAMS,QAAAA,GAAW;AACf,QAAA,MAAM,IAAI,CAAChD,UAAU,EAAEuC,sBAAAA,CAAuB,UAAA,CAAA;AAChD,IAAA;IAEAU,UAAAA,GAAa;AACX,QAAA,IAAI,CAAC,IAAI,CAACjD,UAAU,EAAE;YACpB,OAAOyC,OAAAA,CAAQC,OAAO,CAAC,IAAA,CAAA;AACzB,QAAA;AAEA,QAAA,OAAO,IAAI,CAAC1C,UAAU,CAACuC,sBAAsB,CAAmC,YAAA,CAAA;AAClF,IAAA;IAEAW,yBAAAA,GAAsC;AACpC,QAAA,OAAO,+BAAA,CAAA,IAAI,EAAC,YAAA,CAAA,CAAA,YAAA,CAAA,CAAa,UAAA,CAAA;AAC3B,IAAA;IAEAC,sBAAAA,GAAmC;AACjC,QAAA,OAAO,+BAAA,CAAA,IAAI,EAAC,YAAA,CAAA,CAAA,YAAA,CAAA,CAAa,OAAA,CAAA;AAC3B,IAAA;IAEAC,8BAAAA,GAA2C;AACzC,QAAA,OAAO,+BAAA,CAAA,IAAI,EAAC,YAAA,CAAA,CAAA,YAAA,CAAA,CAAa,eAAA,CAAA;AAC3B,IAAA;IAEAC,uBAAAA,GAAwD;AACtD,QAAA,IAAIC,QAAoC,EAAE;AAC1C,QAAA,IAAIC,UAAAA,GAAa,KAAA;AACjB,QAAA,MAAMzD,eAAAA,GAAkB,+BAAA,CAAA,IAAI,EAAC,iBAAA,CAAA,CAAA,iBAAA,CAAA;AAC7B,QAAA,MAAM0D,mBACJ,+BAAA,CAAA,IAAI,EAAC,cAAA,CAAA,CAAA,cAAA,CAAA,KAAmB,WACpBC,8BAAAA,GACAC,oCAAAA;QAEN,MAAMC,SAAAA,GAAY,IAAA,GAAO,IAAA,CAAA;AACzB,QAAA,MAAMC,WAAAA,GAAc,IAAA;YAClB,OAAON,KAAAA,CAAMO,MAAM,CAAC,CAACC,KAAKC,KAAAA,GAAUD,GAAAA,GAAME,mCAAmCD,KAAAA,CAAAA,EAAQ,CAAA,CAAA;AACvF,QAAA,CAAA;AACA,QAAA,MAAME,uBAAAA,GAA0B,+BAAA,CAAA,IAAI,EAAC,gBAAA,cAAA,CAAA,CAAe,QAAA,CAAA;AAEpD,QAAA,MAAMC,KAAAA,GAAQ,UAAA;AACZ,YAAA,MAAMC,cAAc,MAAM,+BAAA,CAAA,IAAI,EAAC,WAAA,CAAA,CAAA,aAAY,QAAA,EAAUb,KAAAA,CAAAA;AACrDA,YAAAA,KAAAA,GAAQ,EAAE;YACV,OAAOa,WAAAA;AACT,QAAA,CAAA;AAEA,QAAA,MAAMC,WAAW,OAAOL,KAAAA,GAAAA;AACtBT,YAAAA,KAAAA,CAAMe,IAAI,CAACN,KAAAA,CAAAA;AAEX,YAAA,IAAIH,iBAAiBD,SAAAA,EAAW;AAC9B,gBAAA,MAAMQ,cAAc,MAAMD,KAAAA,EAAAA;AAC1B,gBAAA,IAAIC,WAAAA,EAAa;oBACf,MAAMA,WAAAA;AACR,gBAAA;AACF,YAAA;AACF,QAAA,CAAA;AAEA,QAAA,OAAO,IAAIG,QAAAA,CAAS;YAClBC,UAAAA,EAAY,IAAA;AACZC,YAAAA,KAAAA,EAAO,OAAOC,QAAAA,GAAAA;gBACZ,IAAInB,KAAAA,CAAMoB,MAAM,GAAG,CAAA,EAAG;oBACpB,MAAMR,KAAAA,EAAAA;AACR,gBAAA;AAEA,gBAAA,IAAIX,UAAAA,EAAY;oBACd,MAAM,EAAEoB,KAAAA,EAAOC,YAAY,EAAE,GAAG,MAAM,+BAAA,CAAA,IAAI,EAAC,QAAA,CAAA,CAAA,QAAA,CAAA,CAAS,QAAA,CAAA;AAEpD,oBAAA,IAAIA,YAAAA,EAAc;AAChB,wBAAA,OAAOH,QAAAA,CAASG,YAAAA,CAAAA;AAClB,oBAAA;AACF,gBAAA;AAEA,gBAAA,OAAOH,QAAAA,CAAS,IAAA,CAAA;AAClB,YAAA,CAAA;AAEA,YAAA,MAAMI,KAAAA,CAAAA,CAAMC,KAAa,EAAEC,SAAS,EAAEN,QAAQ,EAAA;AAC5C,gBAAA,MAAMO,aAAa,MAAMf,uBAAAA,EAAAA;AACzB,gBAAA,IAAIe,UAAAA,EAAY;AACd,oBAAA,OAAOP,QAAAA,CAASO,UAAAA,CAAAA;AAClB,gBAAA;gBAEAzB,UAAAA,GAAa,IAAA;AAEb,gBAAA,MAAM0B,OAAAA,GAAUC,UAAAA,EAAAA;gBAChB,MAAM,EAAEC,QAAQ,EAAEC,QAAQ,EAAEjG,KAAK,EAAEkG,MAAM,EAAEC,QAAQ,EAAE,GAAGR,KAAAA;gBACxD,MAAMS,YAAAA,GAAezF,eAAAA,GAAkB0F,UAAAA,CAAW,QAAA,CAAA,GAAY5D,SAAAA;gBAE9D,IAAI;AACF,oBAAA,MAAMwC,QAAAA,CAAS;wBACbqB,MAAAA,EAAQ,OAAA;AACRR,wBAAAA,OAAAA;wBACAS,IAAAA,EAAM;AAAEP,4BAAAA,QAAAA;AAAUC,4BAAAA,QAAAA;AAAUjG,4BAAAA,KAAAA;AAAOmG,4BAAAA;AAAS;AAC9C,qBAAA,CAAA;oBAEA,WAAW,MAAMvB,SAASsB,MAAAA,CAAQ;AAChCE,wBAAAA,YAAAA,EAAcI,MAAAA,CAAO5B,KAAAA,CAAAA;wBACrB,MAAMK,QAAAA,CAASZ,iBAAiByB,OAAAA,EAASlB,KAAAA,CAAAA,CAAAA;AAC3C,oBAAA;AAEA,oBAAA,MAAMK,QAAAA,CAAS;wBACbqB,MAAAA,EAAQ,KAAA;AACRR,wBAAAA,OAAAA;AACA,wBAAA,GAAIM,YAAAA,GACA;4BAAEK,QAAAA,EAAU;gCAAEC,SAAAA,EAAW,QAAA;gCAAmBC,KAAAA,EAAOP,YAAAA,CAAaQ,MAAM,CAAC,KAAA;AAAO;AAAE,yBAAA,GAChF;AACN,qBAAA,CAAA;AAEAtB,oBAAAA,QAAAA,EAAAA;AACF,gBAAA,CAAA,CAAE,OAAOE,KAAAA,EAAO;AACdF,oBAAAA,QAAAA,CAASE,KAAAA,YAAiBqB,KAAAA,GAAQrB,KAAAA,GAAQ,IAAIqB,MAAMC,MAAAA,CAAOtB,KAAAA,CAAAA,CAAAA,CAAAA;AAC7D,gBAAA;AACF,YAAA;AACF,SAAA,CAAA;AACF,IAAA;AAhdA,IAAA,WAAA,CAAY/E,OAAgD,CAAE;QAqE9D,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,cAAA,EAAA;AAAA,YAAA,KAAA,EAAA;;QAIA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAM,UAAA,EAAA;AAAN,YAAA,KAAA,EAAA;;QAoBA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAM,QAAA,EAAA;AAAN,YAAA,KAAA,EAAA;;QAwBA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAM,WAAA,EAAA;AAAN,YAAA,KAAA,EAAA;;QA4BA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,YAAA,EAAA;AAAA,YAAA,KAAA,EAAA;;QAwFA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,WAAA,EAAA;AAAA,YAAA,KAAA,EAAA;;QAWA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,cAAA,EAAA;AAAA,YAAA,KAAA,EAAA;;QA/PA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,YAAA,EAAA;;mBAAA;;QAEA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,iBAAA,EAAA;;mBAAA;;QAOA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,cAAA,EAAA;;mBAAA;;aAvBAsG,IAAAA,GAAO,4BAAA;aAEPrE,IAAAA,GAAqB,aAAA;AAcrB,QAAA,+BAAA,CAAA,IAAA,EAAA,iBAAA,CAAA,CAAA,iBAAA,CAAA,GAAoB,KAAA;AAOpB,QAAA,+BAAA,CAAA,IAAA,EAAA,cAAA,CAAA,CAAA,cAAA,CAAA,GAAkD,QAAA;QAGhD,IAAI,CAACjC,OAAO,GAAGA,OAAAA;QACf,IAAI,CAACmB,EAAE,GAAG,IAAA;QACV,IAAI,CAACf,UAAU,GAAG,IAAA;QAClB,IAAI,CAACQ,UAAU,GAAG,IAAA;AAClB,QAAA,+BAAA,CAAA,IAAI,EAAC,iBAAA,CAAA,CAAA,iBAAA,CAAA,GAAoBZ,OAAAA,CAAQE,eAAe,KAAK,IAAA;AAErD,QAAA,IAAI,CAACZ,UAAU,EAAA;AACjB,IAAA;AAycF;AA5YE,SAAA,cAAeiH,KAA8B,EAAA;AAC3C,IAAA,OAAOC,KAAK,IAAM,+BAAA,CAAA,IAAI,EAAC,YAAA,UAAA,CAAA,CAAWD,KAAAA,CAAAA,CAAAA;AACpC;AAEA,eAAA,UAAoDE,IAAO,EAAA;IACzD,IAAI;AACF,QAAA,MAAM,IAAI,CAACrG,UAAU,EAAEsG,oBAAAA,CAAqB;YAAEb,MAAAA,EAAQ,OAAA;AAASY,YAAAA;AAAK,SAAA,CAAA;AACtE,IAAA,CAAA,CAAE,OAAOE,CAAAA,EAAG;AACV,QAAA,IAAIA,aAAaP,KAAAA,EAAO;YACtB,OAAOO,CAAAA;AACT,QAAA;QAEA,IAAI,OAAOA,MAAM,QAAA,EAAU;AACzB,YAAA,OAAO,IAAI9F,qBAAAA,CAAsB8F,CAAAA,CAAAA;AACnC,QAAA;AAEA,QAAA,OAAO,IAAI9F,qBAAAA,CAAsB,kBAAA,CAAA;AACnC,IAAA;AAEA,IAAA,IAAI,CAACtB,KAAK,CAACkH,IAAAA,CAAK,GAAG;QAAEhH,KAAAA,EAAO;AAAE,KAAA;IAE9B,OAAO,IAAA;AACT;AAEA,eAAA,QAAkDgH,IAAO,EAAA;IACvD,IAAI;AACF,QAAA,MAAM9F,MAAM,MAAM,IAAI,CAACP,UAAU,EAAEsG,oBAAAA,CAGhC;YACDb,MAAAA,EAAQ,KAAA;AACRY,YAAAA;AACF,SAAA,CAAA;QAEA,OAAO;AAAElH,YAAAA,KAAAA,EAAOoB,KAAKpB,KAAAA,IAAS,IAAA;YAAMwF,KAAAA,EAAO;AAAK,SAAA;AAClD,IAAA,CAAA,CAAE,OAAO4B,CAAAA,EAAG;AACV,QAAA,IAAIA,aAAaP,KAAAA,EAAO;YACtB,OAAO;gBAAE7G,KAAAA,EAAO,IAAA;gBAAMwF,KAAAA,EAAO4B;AAAE,aAAA;AACjC,QAAA;QAEA,IAAI,OAAOA,MAAM,QAAA,EAAU;YACzB,OAAO;gBAAEpH,KAAAA,EAAO,IAAA;AAAMwF,gBAAAA,KAAAA,EAAO,IAAIlE,qBAAAA,CAAsB8F,CAAAA;AAAG,aAAA;AAC5D,QAAA;QAEA,OAAO;YAAEpH,KAAAA,EAAO,IAAA;AAAMwF,YAAAA,KAAAA,EAAO,IAAIlE,qBAAAA,CAAsB,kBAAA;AAAoB,SAAA;AAC7E,IAAA;AACF;AAEA,eAAA,UAAA,CACE4F,IAAO,EACPlE,OAA4C,EAAA;IAE5C,IAAI;AACF,QAAA,IAAIkE,SAAS,QAAA,EAAU;AACrB,YAAA,MAAMG,YAAAA,GAAerE,OAAAA;AACrB,YAAA,IAAI,CAAChD,KAAK,CAACkH,IAAAA,CAAK,CAAChH,KAAK,IAAImH,YAAAA,CAAaC,MAAM,CAAC,CAACf,IAAAA,GAASA,IAAAA,CAAKD,MAAM,KAAK,SAASf,MAAM;QACzF,CAAA,MAAO;YACL,IAAI,CAACvF,KAAK,CAACkH,IAAAA,CAAK,CAAChH,KAAK,IAAI8C,QAAQuC,MAAM;AAC1C,QAAA;AAEA,QAAA,MAAM,IAAI,CAAC1E,UAAU,EAAEsG,oBAAAA,CAAqB;YAAEb,MAAAA,EAAQ,QAAA;AAAUY,YAAAA,IAAAA;YAAMX,IAAAA,EAAMvD;AAAQ,SAAA,CAAA;AACtF,IAAA,CAAA,CAAE,OAAOoE,CAAAA,EAAG;AACV,QAAA,IAAIA,aAAaP,KAAAA,EAAO;YACtB,OAAOO,CAAAA;AACT,QAAA;QAEA,IAAI,OAAOA,MAAM,QAAA,EAAU;AACzB,YAAA,OAAO,IAAI9F,qBAAAA,CAAsB8F,CAAAA,CAAAA;AACnC,QAAA;AAEA,QAAA,OAAO,IAAI9F,qBAAAA,CAAsB,kBAAA,CAAA;AACnC,IAAA;IAEA,OAAO,IAAA;AACT;AAEA,SAAA,YAAa4F,IAAgD,EAAA;AAG3D,IAAA,MAAMK,iBAAAA,GAAoB,+BAAA,CAAA,IAAI,EAAC,gBAAA,cAAA,CAAA,CAAeL,IAAAA,CAAAA;AAE9C,IAAA,IAAI/C,QAAQ,EAAE;AACd,IAAA,IAAIqD,cAAAA,GAAiB,CAAA;IAErB,MAAM/C,WAAAA,GAAc,IAAMpF,UAAAA,CAAW8E,KAAAA,CAAAA;AAErC,IAAA,MAAMsD,UAAAA,GAAa,UAAA;QACjB,IAAItD,KAAAA,CAAMoB,MAAM,KAAK,CAAA,EAAG;YACtB,OAAO,IAAA;AACT,QAAA;AACA,QAAA,MAAMmC,OAAAA,GAAUvD,KAAAA;AAChBA,QAAAA,KAAAA,GAAQ,EAAE;QACVqD,cAAAA,GAAiB,CAAA;AACjB,QAAA,OAAO,+BAAA,CAAA,IAAI,EAAC,WAAA,CAAA,CAAA,aAAYN,IAAAA,EAAMQ,OAAAA,CAAAA;AAChC,IAAA,CAAA;AAEA,IAAA,MAAMC,yBAAAA,GAA4B,IAAA;QAChC,IAAIxD,KAAAA,CAAMoB,MAAM,KAAK,CAAA,EAAG;YACtB,OAAO,KAAA;AACT,QAAA;QACA,OACEd,WAAAA,EAAAA,IAAiB9E,+BACjBwE,KAAAA,CAAMoB,MAAM,IAAI3F,2BAAAA,IAChBgI,IAAAA,CAAKC,GAAG,EAAA,GAAKL,cAAAA,IAAkB3H,4BAAAA;AAEnC,IAAA,CAAA;AAEA,IAAA,OAAO,IAAIsF,QAAAA,CAAS;QAClBC,UAAAA,EAAY,IAAA;AAEZC,QAAAA,KAAAA,EAAO,OAAOC,QAAAA,GAAAA;YACZ,IAAInB,KAAAA,CAAMoB,MAAM,GAAG,CAAA,EAAG;AACpB,gBAAA,MAAMP,cAAc,MAAMyC,UAAAA,EAAAA;AAE1B,gBAAA,IAAIzC,WAAAA,EAAa;AACf,oBAAA,OAAOM,QAAAA,CAASN,WAAAA,CAAAA;AAClB,gBAAA;AACF,YAAA;YACA,MAAM,EAAEQ,KAAK,EAAExF,KAAK,EAAE,GAAG,MAAM,+BAAA,CAAA,IAAI,EAAC,QAAA,CAAA,CAAA,QAAA,CAAA,CAASkH,IAAAA,CAAAA;YAE7C,MAAM,EAAEhH,KAAK,EAAE,GAAG,IAAI,CAACF,KAAK,CAACkH,IAAAA,CAAK;YAElC,IAAIlH,KAAAA,KAAUA,KAAAA,CAAM8H,OAAO,KAAK5H,SAASF,KAAAA,CAAM+H,QAAQ,KAAK7H,KAAI,CAAA,EAAI;AAClEoF,gBAAAA,QAAAA,CACE,IAAIuB,KAAAA,CACF,CAAC,mBAAmB,EAAE,IAAI,CAAC7G,KAAK,CAACkH,IAAAA,CAAK,CAAChH,KAAK,CAAC,CAAC,EAAEgH,IAAAA,CAAK,WAAW,EAAElH,KAAAA,CAAM8H,OAAO,CAAC,WAAW,EAAE9H,KAAAA,CAAM+H,QAAQ,CAAC,CAAC,EAAEb,IAAAA,CAAAA,CAAM,CAAA,CAAA;AAG3H,YAAA;YAEA5B,QAAAA,CAASE,KAAAA,CAAAA;AACX,QAAA,CAAA;AAEA,QAAA,MAAME,KAAAA,CAAAA,CAAMd,KAAK,EAAEgB,SAAS,EAAEN,QAAQ,EAAA;AACpC,YAAA,MAAMO,aAAa,MAAM0B,iBAAAA,EAAAA;AACzB,YAAA,IAAI1B,UAAAA,EAAY;AACd,gBAAA,OAAOP,QAAAA,CAASO,UAAAA,CAAAA;AAClB,YAAA;;YAGA,IAAI1B,KAAAA,CAAMoB,MAAM,GAAG,CAAA,IAAKqC,KAAKC,GAAG,EAAA,GAAKL,kBAAkB3H,4BAAAA,EAA8B;AACnF,gBAAA,MAAMmI,aAAa,MAAMP,UAAAA,EAAAA;AACzB,gBAAA,IAAIO,UAAAA,EAAY;AACd,oBAAA,OAAO1C,QAAAA,CAAS0C,UAAAA,CAAAA;AAClB,gBAAA;AACF,YAAA;AAEA7D,YAAAA,KAAAA,CAAMe,IAAI,CAACN,KAAAA,CAAAA;YACX,IAAIT,KAAAA,CAAMoB,MAAM,KAAK,CAAA,EAAG;AACtBiC,gBAAAA,cAAAA,GAAiBI,KAAKC,GAAG,EAAA;AAC3B,YAAA;AAEA,YAAA,IAAIF,yBAAAA,EAAAA,EAA6B;AAC/B,gBAAA,MAAM3C,cAAc,MAAMyC,UAAAA,EAAAA;AAC1B,gBAAA,IAAIzC,WAAAA,EAAa;AACf,oBAAA,OAAOM,QAAAA,CAASN,WAAAA,CAAAA;AAClB,gBAAA;AACF,YAAA;AAEAM,YAAAA,QAAAA,EAAAA;AACF,QAAA;AACF,KAAA,CAAA;AACF;AAEA,SAAA,WAAYtC,OAAe,EAAA;AACzB,IAAA,+BAAA,CAAA,IAAI,EAAC,YAAA,CAAA,CAAA,YAAA,CAAA,EAAciF,MAAAA,CAAO;QACxBhG,OAAAA,EAAS;AACPiG,YAAAA,SAAAA,EAAW,IAAIN,IAAAA,EAAAA;AACf5E,YAAAA,OAAAA;YACAmF,MAAAA,EAAQ;AACV,SAAA;QACAhF,IAAAA,EAAM;AACR,KAAA,CAAA;AACF;AAEA,SAAA,cAAeH,OAAe,EAAA;AAC5B,IAAA,+BAAA,CAAA,IAAI,EAAC,YAAA,CAAA,CAAA,YAAA,CAAA,EAAciF,MAAAA,CAAO;QACxBhG,OAAAA,EAAS;AACPiG,YAAAA,SAAAA,EAAW,IAAIN,IAAAA,EAAAA;AACf5E,YAAAA,OAAAA;YACAmF,MAAAA,EAAQ;AACV,SAAA;QACAhF,IAAAA,EAAM;AACR,KAAA,CAAA;AACF;AAsNK,MAAMiF,wCAAwC,CACnD3H,OAAAA,GAAAA;AAEA,IAAA,OAAO,IAAIX,+BAAAA,CAAgCW,OAAAA,CAAAA;AAC7C;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/strapi/providers/remote-source/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAe,QAAQ,EAAY,MAAM,QAAQ,CAAC;AACzD,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAE/B,OAAO,KAAK,EAEV,SAAS,EACT,eAAe,EACf,8BAA8B,EAC9B,YAAY,EAEZ,YAAY,EACZ,mBAAmB,EACnB,aAAa,EACd,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAkB,IAAI,EAAE,MAAM,gCAAgC,CAAC;AAKtE,OAAO,EAAE,iCAAiC,EAAE,MAAM,iBAAiB,CAAC;AACpE,OAAO,EACL,gBAAgB,EAIjB,MAAM,UAAU,CAAC;AAYlB,MAAM,WAAW,kCAAmC,SAAQ,iCAAiC;IAC3F,GAAG,EAAE,GAAG,CAAC;IACT,IAAI,CAAC,EAAE,IAAI,CAAC,kBAAkB,CAAC;IAC/B,mBAAmB,CAAC,EAAE;QACpB,mBAAmB,EAAE,MAAM,CAAC;QAC5B,sBAAsB,EAAE,MAAM,CAAC;KAChC,CAAC;IACF,yHAAyH;IACzH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,2EAA2E;IAC3E,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAKD,cAAM,0BAA2B,YAAW,eAAe;;IACzD,IAAI,SAA2B;IAE/B,IAAI,EAAE,YAAY,CAAY;IAE9B,OAAO,EAAE,kCAAkC,CAAC;IAE5C,EAAE,EAAE,SAAS,GAAG,IAAI,CAAC;IAErB,UAAU,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,GAAG,IAAI,CAAC;IAEvD,cAAc,EAAE,OAAO,CAAC,kCAAkC,CAAC,CAGzD;gBAEU,OAAO,EAAE,kCAAkC;IAWvD,OAAO,CAAC,EAAE,8BAA8B,GAAG,SAAS,CAAC;IA2ErD,wBAAwB,IAAI,YAAY,CAAC,QAAQ,CAAC;IAIlD,qBAAqB,IAAI,YAAY,CAAC,QAAQ,CAAC;IAIzC,sBAAsB,IAAI,OAAO,CAAC,QAAQ,CAAC;IAgSjD,6BAA6B,IAAI,YAAY,CAAC,QAAQ,CAAC;IAIjD,WAAW,IAAI,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAM9C,mBAAmB,CAAC,GAAG,EAAE,GAAG;IActB,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;IA+C/B,SAAS,CAAC,WAAW,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAoD3D,KAAK;IAeL,UAAU;IAOV,cAAc,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC;CAwDhF;AAED,eAAO,MAAM,gCAAgC,GAAI,SAAS,kCAAkC,+BAE3F,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/strapi/providers/remote-source/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAe,QAAQ,EAAY,MAAM,QAAQ,CAAC;AACzD,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAE/B,OAAO,KAAK,EAEV,SAAS,EACT,eAAe,EACf,8BAA8B,EAC9B,YAAY,EAEZ,YAAY,EACZ,mBAAmB,EACnB,aAAa,EACd,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAkB,IAAI,EAAE,MAAM,gCAAgC,CAAC;AAKtE,OAAO,EAAE,iCAAiC,EAAE,MAAM,iBAAiB,CAAC;AACpE,OAAO,EACL,gBAAgB,EAIjB,MAAM,UAAU,CAAC;AAYlB,MAAM,WAAW,kCAAmC,SAAQ,iCAAiC;IAC3F,GAAG,EAAE,GAAG,CAAC;IACT,IAAI,CAAC,EAAE,IAAI,CAAC,kBAAkB,CAAC;IAC/B,mBAAmB,CAAC,EAAE;QACpB,mBAAmB,EAAE,MAAM,CAAC;QAC5B,sBAAsB,EAAE,MAAM,CAAC;KAChC,CAAC;IACF,yHAAyH;IACzH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,2EAA2E;IAC3E,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAKD,cAAM,0BAA2B,YAAW,eAAe;;IACzD,IAAI,SAA2B;IAE/B,IAAI,EAAE,YAAY,CAAY;IAE9B,OAAO,EAAE,kCAAkC,CAAC;IAE5C,EAAE,EAAE,SAAS,GAAG,IAAI,CAAC;IAErB,UAAU,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,GAAG,IAAI,CAAC;IAEvD,cAAc,EAAE,OAAO,CAAC,kCAAkC,CAAC,CAGzD;gBAEU,OAAO,EAAE,kCAAkC;IAWvD,OAAO,CAAC,EAAE,8BAA8B,GAAG,SAAS,CAAC;IA2ErD,wBAAwB,IAAI,YAAY,CAAC,QAAQ,CAAC;IAIlD,qBAAqB,IAAI,YAAY,CAAC,QAAQ,CAAC;IAIzC,sBAAsB,IAAI,OAAO,CAAC,QAAQ,CAAC;IAgSjD,6BAA6B,IAAI,YAAY,CAAC,QAAQ,CAAC;IAIjD,WAAW,IAAI,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAM9C,mBAAmB,CAAC,GAAG,EAAE,GAAG;IActB,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;IA8C/B,SAAS,CAAC,WAAW,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAoD3D,KAAK;IAeL,UAAU;IAOV,cAAc,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC;CAwDhF;AAED,eAAO,MAAM,gCAAgC,GAAI,SAAS,kCAAkC,+BAE3F,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../src/strapi/providers/remote-source/index.ts"],"sourcesContent":["import { createHash, type Hash } from 'crypto';\nimport { PassThrough, Readable, Writable } from 'stream';\nimport type { Struct, Utils } from '@strapi/types';\nimport { WebSocket } from 'ws';\n\nimport type {\n IAsset,\n IMetadata,\n ISourceProvider,\n ISourceProviderTransferResults,\n MaybePromise,\n Protocol,\n ProviderType,\n StageTotalsEstimate,\n TransferStage,\n} from '../../../types';\nimport type { IDiagnosticReporter } from '../../../utils/diagnostic';\nimport { Client, Server, Auth } from '../../../types/remote/protocol';\nimport { ProviderTransferError, ProviderValidationError } from '../../../errors/providers';\nimport { TRANSFER_PATH } from '../../remote/constants';\nimport { decodeTransferAssetStreamItem } from '../../../utils/transfer-asset-chunk';\nimport { write } from '../../../utils/writable-async-write';\nimport { ILocalStrapiSourceProviderOptions } from '../local-source';\nimport {\n createDispatcher,\n connectToWebsocket,\n trimTrailingSlash,\n type RetryMessageOptions,\n} from '../utils';\n\n/**\n * Pull server answers `assets` step `start` only after `estimateAssetTotals` (DB stream; remote sizes from DB when complete, else HTTP like `createAssetsStream`).\n * That can exceed the default dispatcher wait (~30s between resends, a few minutes total). This message\n * uses a longer window so large libraries do not fail with `Request timed out` before totals are returned.\n */\nconst ASSETS_START_RETRY_OVERRIDES: Partial<RetryMessageOptions> = {\n retryMessageTimeout: 120_000,\n retryMessageMaxRetries: 30,\n};\n\nexport interface IRemoteStrapiSourceProviderOptions extends ILocalStrapiSourceProviderOptions {\n url: URL; // the url of the remote Strapi admin\n auth?: Auth.ITransferTokenAuth;\n retryMessageOptions?: {\n retryMessageTimeout: number; // milliseconds to wait for a response from a message\n retryMessageMaxRetries: number; // max number of retries for a message before aborting transfer\n };\n /** Max ms without forward progress on an asset (new remote chunk accepted or chunk fully handed to the asset stream). */\n streamTimeout?: number;\n /** Require per-asset checksum verification for transferred asset bytes. */\n verifyChecksums?: boolean;\n}\n\ntype QueueableAction = Protocol.Client.TransferAssetFlow &\n ({ action: 'stream' } | { action: 'end' });\n\nclass RemoteStrapiSourceProvider implements ISourceProvider {\n name = 'source::remote-strapi';\n\n type: ProviderType = 'source';\n\n options: IRemoteStrapiSourceProviderOptions;\n\n ws: WebSocket | null;\n\n dispatcher: ReturnType<typeof createDispatcher> | null;\n\n defaultOptions: Partial<IRemoteStrapiSourceProviderOptions> = {\n // Large files + JSON/WS backpressure can go minutes between *messages* while bytes still drain locally\n streamTimeout: 300_000,\n };\n\n constructor(options: IRemoteStrapiSourceProviderOptions) {\n this.options = {\n ...this.defaultOptions,\n ...options,\n };\n this.#checksumsEnabled = this.options.verifyChecksums === true;\n\n this.ws = null;\n this.dispatcher = null;\n }\n\n results?: ISourceProviderTransferResults | undefined;\n\n #diagnostics?: IDiagnosticReporter;\n\n #pullAssetStreamWireSampleLogged = false;\n\n #checksumsEnabled = false;\n\n /** Set from pull server `start` response for `assets` when present (for engine `getStageTotals`). */\n #cachedAssetsTotals?: StageTotalsEstimate;\n\n async #createStageReadStream(stage: Exclude<TransferStage, 'schemas'>) {\n if (stage === 'assets') {\n this.#cachedAssetsTotals = undefined;\n }\n\n const startResult = await this.#startStep(stage);\n\n if (startResult instanceof Error) {\n throw startResult;\n }\n\n const { id: processID, totals } = startResult as {\n id: string;\n totals?: StageTotalsEstimate;\n };\n\n if (stage === 'assets' && totals && (totals.totalBytes != null || totals.totalCount != null)) {\n this.#cachedAssetsTotals = totals;\n }\n\n // Default object-mode HWM (~16 chunks). Do not await `drain` on manual `push` while `pipe()`\n // is attached — drain/`readableLength` races reliably deadlock after a few 1MiB asset frames.\n // Backpressure for pull assets is enforced by the Writable below (`highWaterMark: 1`).\n const stream = new PassThrough({ objectMode: true });\n\n const listener = async (raw: Buffer) => {\n const parsed = JSON.parse(raw.toString());\n // If not a message related to our transfer process, ignore it\n if (!parsed.uuid || parsed?.data?.type !== 'transfer' || parsed?.data?.id !== processID) {\n this.ws?.once('message', listener);\n return;\n }\n\n const { uuid, data: message } = parsed;\n const { ended, error, data } = message;\n\n if (error) {\n await this.#respond(uuid);\n stream.destroy(error);\n return;\n }\n\n if (ended) {\n await this.#respond(uuid);\n await this.#endStep(stage);\n\n stream.end();\n return;\n }\n\n for (const item of Array.isArray(data) ? data : [data]) {\n stream.push(item as Parameters<PassThrough['push']>[0]);\n }\n\n this.ws?.once('message', listener);\n\n await this.#respond(uuid);\n };\n\n this.ws?.once('message', listener);\n\n return stream;\n }\n\n createEntitiesReadStream(): MaybePromise<Readable> {\n return this.#createStageReadStream('entities');\n }\n\n createLinksReadStream(): MaybePromise<Readable> {\n return this.#createStageReadStream('links');\n }\n\n async createAssetsReadStream(): Promise<Readable> {\n // Create the streams used to transfer the assets\n const stream = await this.#createStageReadStream('assets');\n const pass = new PassThrough({ objectMode: true });\n\n // Init the asset map\n const assets: {\n // TODO: could we include filename in this for improved logging?\n [assetID: string]: IAsset & {\n stream: PassThrough;\n queue: Array<QueueableAction>;\n status: 'ok' | 'closed' | 'errored';\n timeout?: NodeJS.Timeout;\n checksumHash?: Hash;\n };\n } = {};\n\n // Watch for stalled assets: no remote chunks and no completed writes to the asset stream for streamTimeout ms\n const resetTimeout = (assetID: string) => {\n if (!assets[assetID]) {\n return;\n }\n if (assets[assetID].timeout) {\n clearTimeout(assets[assetID].timeout);\n }\n assets[assetID].timeout = setTimeout(() => {\n if (!assets[assetID]) {\n return;\n }\n this.#reportInfo(`Asset ${assetID} transfer stalled, aborting.`);\n assets[assetID].status = 'errored';\n assets[assetID].stream.destroy(new Error(`Asset ${assetID} transfer timed out`));\n }, this.options.streamTimeout);\n };\n\n const clearStallTimeoutForAsset = (assetID: string) => {\n const entry = assets[assetID];\n if (entry?.timeout) {\n clearTimeout(entry.timeout);\n entry.timeout = undefined;\n }\n };\n\n const clearAllStallTimeouts = () => {\n for (const id of Object.keys(assets)) {\n clearStallTimeoutForAsset(id);\n }\n };\n\n /**\n * Serialize asset batch handling: `Readable.on('data', async …)` does not apply backpressure,\n * so we pipe through a Writable with highWaterMark 1 so only one batch is in flight.\n */\n const processAssetPayload = async (payload: Protocol.Client.TransferAssetFlow[]) => {\n for (const item of payload) {\n const { action, assetID } = item;\n\n if (action === 'start') {\n if (assets[assetID]) {\n throw new Error(`Asset ${assetID} already started`);\n }\n\n this.#reportInfo(`Asset ${assetID} starting`);\n assets[assetID] = {\n ...item.data,\n stream: new PassThrough(),\n status: 'ok',\n queue: [],\n ...(this.#checksumsEnabled ? { checksumHash: createHash('sha256') } : {}),\n };\n\n resetTimeout(assetID);\n\n await write(pass, assets[assetID]);\n } else if (action === 'stream' || action === 'end') {\n if (!assets[assetID]) {\n throw new Error(`No id matching ${assetID} for stream action`);\n }\n\n if (action === 'stream') {\n if (!this.#pullAssetStreamWireSampleLogged) {\n this.#pullAssetStreamWireSampleLogged = true;\n const { data } = item;\n // Same legacy shape `decodeTransferAssetStreamData` accepts after JSON.parse (proof, not frame-size guess).\n const legacyBufferJson =\n data &&\n typeof data === 'object' &&\n !Buffer.isBuffer(data) &&\n (data as { type?: string }).type === 'Buffer' &&\n (Array.isArray((data as { data?: unknown }).data) ||\n ArrayBuffer.isView((data as { data?: unknown }).data));\n if (legacyBufferJson) {\n this.#reportWarning(\n '[Data transfer][pull] Remote is using legacy Buffer JSON for asset chunks (each byte as a JSON number). That uses much more memory during JSON.parse than base64. Upgrade the remote Strapi to a version that sends base64 asset chunks, or out-of-memory errors may still happen on large files.'\n );\n }\n }\n resetTimeout(assetID);\n } else {\n clearTimeout(assets[assetID].timeout);\n }\n\n if (assets[assetID].status === 'closed') {\n throw new Error(`Asset ${assetID} is closed`);\n }\n\n assets[assetID].queue.push(item);\n }\n }\n\n for (const assetID in assets) {\n if (Object.prototype.hasOwnProperty.call(assets, assetID)) {\n const asset = assets[assetID];\n if (asset.queue?.length > 0) {\n await processQueue(assetID);\n }\n }\n }\n };\n\n const processor = new Writable({\n objectMode: true,\n highWaterMark: 1,\n write(payload: Protocol.Client.TransferAssetFlow[], _encoding, callback) {\n processAssetPayload(payload).then(\n () => {\n callback();\n },\n (err: Error) => {\n clearAllStallTimeouts();\n stream.destroy(err);\n callback(err);\n }\n );\n },\n final(callback) {\n pass.end();\n callback();\n },\n });\n\n processor.on('error', (err) => {\n clearAllStallTimeouts();\n pass.destroy(err);\n });\n\n stream.on('error', (err) => {\n clearAllStallTimeouts();\n processor.destroy(err);\n pass.destroy(err);\n });\n\n stream.once('end', () => {\n clearAllStallTimeouts();\n });\n\n stream.pipe(processor);\n\n /**\n * Start processing the queue for a given assetID\n *\n * Even though this is a loop that attempts to process the entire queue, it is safe to call this more than once\n * for the same asset id because the queue is shared globally, the items are shifted off, and immediately written\n */\n const processQueue = async (id: string) => {\n if (!assets[id]) {\n throw new Error(`Failed to write asset chunk for \"${id}\". Asset not found.`);\n }\n\n const asset = assets[id];\n const { status: currentStatus } = asset;\n\n if (['closed', 'errored'].includes(currentStatus)) {\n throw new Error(\n `Failed to write asset chunk for \"${id}\". The asset is currently \"${currentStatus}\"`\n );\n }\n\n while (asset.queue.length > 0) {\n const data = asset.queue.shift();\n\n if (!data) {\n throw new Error(`Invalid chunk found for ${id}`);\n }\n\n try {\n // if this is an end chunk, close the asset stream\n if (data.action === 'end') {\n this.#reportInfo(`Ending asset stream for ${id}`);\n await closeAssetStream(id, data.checksum);\n break; // Exit the loop after closing the stream\n }\n\n // Save the current chunk\n await writeChunkToStream(id, data);\n } catch (error) {\n if (!assets[id]) {\n throw new Error(`No id matching ${id} for writeAssetChunk`);\n }\n clearStallTimeoutForAsset(id);\n if (error instanceof Error) {\n throw error;\n }\n throw new Error(`Unexpected error while processing asset chunk for \"${id}\"`);\n }\n }\n };\n\n /**\n * Writes a chunk of data to the asset's stream.\n *\n * Only check if the targeted asset exists, no other validation is done.\n */\n const writeChunkToStream = async (id: string, item: QueueableAction) => {\n const asset = assets[id];\n\n if (!asset) {\n throw new Error(`Failed to write asset chunk for \"${id}\". Asset not found.`);\n }\n\n if (item.action !== 'stream') {\n throw new Error(`Expected stream queue item for \"${id}\"`);\n }\n const chunk = decodeTransferAssetStreamItem(item);\n asset.checksumHash?.update(chunk);\n\n await write(asset.stream, chunk);\n // Count slow draining as progress so backpressure on large chunks does not trip the stall timer\n resetTimeout(id);\n };\n\n /**\n * Closes the asset stream associated with the given ID.\n *\n * It deletes the stream for the asset upon successful closure.\n */\n const closeAssetStream = async (\n id: string,\n checksum?: { algorithm: 'sha256'; value: string }\n ) => {\n if (!assets[id]) {\n throw new Error(`Failed to close asset \"${id}\". Asset not found.`);\n }\n\n const asset = assets[id];\n // The queue processes stream chunks before `end`; the last `writeChunkToStream` calls\n // `resetTimeout` after the `end` chunk already cleared the timer — clear again before closing.\n clearStallTimeoutForAsset(id);\n\n if (this.#checksumsEnabled) {\n if (!checksum) {\n throw new ProviderTransferError(\n `Asset ${id} is missing checksum in transfer end payload`\n );\n }\n if (checksum.algorithm !== 'sha256') {\n throw new ProviderTransferError(\n `Asset ${id} checksum algorithm \"${checksum.algorithm}\" is not supported`\n );\n }\n const actual = asset.checksumHash?.digest('hex');\n if (!actual || actual !== checksum.value) {\n throw new ProviderTransferError(\n `Checksum mismatch for asset \"${id}\" (expected ${checksum.value}, got ${actual ?? 'none'})`\n );\n }\n }\n asset.status = 'closed';\n\n await new Promise<void>((resolve, reject) => {\n const { stream } = asset;\n\n stream\n .on('close', () => {\n delete assets[id];\n resolve();\n })\n .on('error', (e) => {\n delete assets[id];\n reject(new Error(`Failed to close asset \"${id}\". Asset stream error: ${e.toString()}`));\n })\n .end();\n });\n };\n\n return pass;\n }\n\n createConfigurationReadStream(): MaybePromise<Readable> {\n return this.#createStageReadStream('configuration');\n }\n\n async getMetadata(): Promise<IMetadata | null> {\n const metadata = await this.dispatcher?.dispatchTransferAction<IMetadata>('getMetadata');\n\n return metadata ?? null;\n }\n\n assertValidProtocol(url: URL) {\n const validProtocols = ['https:', 'http:'];\n\n if (!validProtocols.includes(url.protocol)) {\n throw new ProviderValidationError(`Invalid protocol \"${url.protocol}\"`, {\n check: 'url',\n details: {\n protocol: url.protocol,\n validProtocols,\n },\n });\n }\n }\n\n async initTransfer(): Promise<string> {\n const wantsChecksums = this.options.verifyChecksums === true;\n const query = this.dispatcher?.dispatchCommand({\n command: 'init',\n ...(wantsChecksums ? { params: { transfer: 'pull', checksums: true } } : {}),\n });\n\n const res = (await query) as\n | (Server.Payload<Server.InitMessage> & { checksums?: boolean })\n | null;\n\n if (!res?.transferID) {\n throw new ProviderTransferError('Init failed, invalid response from the server');\n }\n this.#checksumsEnabled = wantsChecksums && res.checksums === true;\n if (wantsChecksums && res.checksums !== true) {\n this.#reportWarning(\n '[Data transfer][pull] Checksums were requested but the remote does not support checksum negotiation; continuing without checksum validation.'\n );\n }\n\n return res.transferID;\n }\n\n #reportInfo(message: string) {\n this.#diagnostics?.report({\n details: {\n createdAt: new Date(),\n message,\n origin: 'remote-source-provider',\n },\n kind: 'info',\n });\n }\n\n /** Reports a warning diagnostic (`kind: 'warning'`). Consumers (e.g. CLI) choose log levels and routing. */\n #reportWarning(message: string) {\n this.#diagnostics?.report({\n details: {\n createdAt: new Date(),\n message,\n origin: 'remote-source-provider',\n },\n kind: 'warning',\n });\n }\n\n async bootstrap(diagnostics?: IDiagnosticReporter): Promise<void> {\n this.#diagnostics = diagnostics;\n const { url, auth } = this.options;\n let ws: WebSocket;\n this.assertValidProtocol(url);\n const wsProtocol = url.protocol === 'https:' ? 'wss:' : 'ws:';\n const wsUrl = `${wsProtocol}//${url.host}${trimTrailingSlash(\n url.pathname\n )}${TRANSFER_PATH}/pull`;\n\n this.#pullAssetStreamWireSampleLogged = false;\n\n this.#reportInfo('establishing websocket connection');\n // No auth defined, trying public access for transfer\n if (!auth) {\n ws = await connectToWebsocket(wsUrl, undefined, this.#diagnostics);\n }\n\n // Common token auth, this should be the main auth method\n else if (auth.type === 'token') {\n const headers = { Authorization: `Bearer ${auth.token}` };\n ws = await connectToWebsocket(wsUrl, { headers }, this.#diagnostics);\n }\n\n // Invalid auth method provided\n else {\n throw new ProviderValidationError('Auth method not available', {\n check: 'auth.type',\n details: {\n auth: auth.type,\n },\n });\n }\n\n this.#reportInfo('established websocket connection');\n this.ws = ws;\n const { retryMessageOptions } = this.options;\n\n this.#reportInfo('creating dispatcher');\n this.dispatcher = createDispatcher(this.ws, retryMessageOptions, (message: string) =>\n this.#reportInfo(message)\n );\n this.#reportInfo('created dispatcher');\n\n this.#reportInfo('initialize transfer');\n const transferID = await this.initTransfer();\n this.#reportInfo(`initialized transfer ${transferID}`);\n\n this.dispatcher.setTransferProperties({ id: transferID, kind: 'pull' });\n await this.dispatcher.dispatchTransferAction('bootstrap');\n }\n\n async close() {\n await this.dispatcher?.dispatchTransferAction('close');\n\n await new Promise<void>((resolve) => {\n const { ws } = this;\n\n if (!ws || ws.CLOSED) {\n resolve();\n return;\n }\n\n ws.on('close', () => resolve()).close();\n });\n }\n\n async getSchemas() {\n const schemas =\n await this.dispatcher?.dispatchTransferAction<Utils.String.Dict<Struct.Schema>>('getSchemas');\n\n return schemas ?? null;\n }\n\n async getStageTotals(stage: TransferStage): Promise<StageTotalsEstimate | null> {\n if (stage !== 'assets') {\n return null;\n }\n const cached = this.#cachedAssetsTotals;\n return cached ?? null;\n }\n\n async #startStep<T extends Client.TransferPullStep>(step: T) {\n try {\n return await this.dispatcher?.dispatchTransferStep(\n { action: 'start', step },\n step === 'assets' ? { retryOverrides: ASSETS_START_RETRY_OVERRIDES } : undefined\n );\n } catch (e) {\n if (e instanceof Error) {\n return e;\n }\n\n if (typeof e === 'string') {\n return new ProviderTransferError(e);\n }\n\n return new ProviderTransferError('Unexpected error');\n }\n }\n\n async #respond(uuid: string) {\n return new Promise((resolve, reject) => {\n this.ws?.send(JSON.stringify({ uuid }), (e) => {\n if (e) {\n reject(e);\n } else {\n resolve(e);\n }\n });\n });\n }\n\n async #endStep<T extends Client.TransferPullStep>(step: T) {\n try {\n await this.dispatcher?.dispatchTransferStep({ action: 'end', step });\n } catch (e) {\n if (e instanceof Error) {\n return e;\n }\n\n if (typeof e === 'string') {\n return new ProviderTransferError(e);\n }\n\n return new ProviderTransferError('Unexpected error');\n }\n\n return null;\n }\n}\n\nexport const createRemoteStrapiSourceProvider = (options: IRemoteStrapiSourceProviderOptions) => {\n return new RemoteStrapiSourceProvider(options);\n};\n"],"names":["ASSETS_START_RETRY_OVERRIDES","retryMessageTimeout","retryMessageMaxRetries","RemoteStrapiSourceProvider","createEntitiesReadStream","createLinksReadStream","createAssetsReadStream","stream","pass","PassThrough","objectMode","assets","resetTimeout","assetID","timeout","clearTimeout","setTimeout","status","destroy","Error","options","streamTimeout","clearStallTimeoutForAsset","entry","undefined","clearAllStallTimeouts","id","Object","keys","processAssetPayload","payload","item","action","data","queue","checksumHash","createHash","write","legacyBufferJson","Buffer","isBuffer","type","Array","isArray","ArrayBuffer","isView","push","prototype","hasOwnProperty","call","asset","length","processQueue","processor","Writable","highWaterMark","_encoding","callback","then","err","final","end","on","once","pipe","currentStatus","includes","shift","closeAssetStream","checksum","writeChunkToStream","error","chunk","decodeTransferAssetStreamItem","update","ProviderTransferError","algorithm","actual","digest","value","Promise","resolve","reject","e","toString","createConfigurationReadStream","getMetadata","metadata","dispatcher","dispatchTransferAction","assertValidProtocol","url","validProtocols","protocol","ProviderValidationError","check","details","initTransfer","wantsChecksums","verifyChecksums","query","dispatchCommand","command","params","transfer","checksums","res","transferID","bootstrap","diagnostics","auth","ws","wsProtocol","wsUrl","host","trimTrailingSlash","pathname","TRANSFER_PATH","connectToWebsocket","headers","Authorization","token","retryMessageOptions","createDispatcher","message","setTransferProperties","kind","close","CLOSED","getSchemas","schemas","getStageTotals","stage","cached","name","defaultOptions","startResult","processID","totals","totalBytes","totalCount","listener","raw","parsed","JSON","parse","uuid","ended","report","createdAt","Date","origin","step","dispatchTransferStep","retryOverrides","send","stringify","createRemoteStrapiSourceProvider"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../../src/strapi/providers/remote-source/index.ts"],"sourcesContent":["import { createHash, type Hash } from 'crypto';\nimport { PassThrough, Readable, Writable } from 'stream';\nimport type { Struct, Utils } from '@strapi/types';\nimport { WebSocket } from 'ws';\n\nimport type {\n IAsset,\n IMetadata,\n ISourceProvider,\n ISourceProviderTransferResults,\n MaybePromise,\n Protocol,\n ProviderType,\n StageTotalsEstimate,\n TransferStage,\n} from '../../../types';\nimport type { IDiagnosticReporter } from '../../../utils/diagnostic';\nimport { Client, Server, Auth } from '../../../types/remote/protocol';\nimport { ProviderTransferError, ProviderValidationError } from '../../../errors/providers';\nimport { TRANSFER_PATH } from '../../remote/constants';\nimport { decodeTransferAssetStreamItem } from '../../../utils/transfer-asset-chunk';\nimport { write } from '../../../utils/writable-async-write';\nimport { ILocalStrapiSourceProviderOptions } from '../local-source';\nimport {\n createDispatcher,\n connectToWebsocket,\n trimTrailingSlash,\n type RetryMessageOptions,\n} from '../utils';\n\n/**\n * Pull server answers `assets` step `start` only after `estimateAssetTotals` (DB stream; remote sizes from DB when complete, else HTTP like `createAssetsStream`).\n * That can exceed the default dispatcher wait (~30s between resends, a few minutes total). This message\n * uses a longer window so large libraries do not fail with `Request timed out` before totals are returned.\n */\nconst ASSETS_START_RETRY_OVERRIDES: Partial<RetryMessageOptions> = {\n retryMessageTimeout: 120_000,\n retryMessageMaxRetries: 30,\n};\n\nexport interface IRemoteStrapiSourceProviderOptions extends ILocalStrapiSourceProviderOptions {\n url: URL; // the url of the remote Strapi admin\n auth?: Auth.ITransferTokenAuth;\n retryMessageOptions?: {\n retryMessageTimeout: number; // milliseconds to wait for a response from a message\n retryMessageMaxRetries: number; // max number of retries for a message before aborting transfer\n };\n /** Max ms without forward progress on an asset (new remote chunk accepted or chunk fully handed to the asset stream). */\n streamTimeout?: number;\n /** Require per-asset checksum verification for transferred asset bytes. */\n verifyChecksums?: boolean;\n}\n\ntype QueueableAction = Protocol.Client.TransferAssetFlow &\n ({ action: 'stream' } | { action: 'end' });\n\nclass RemoteStrapiSourceProvider implements ISourceProvider {\n name = 'source::remote-strapi';\n\n type: ProviderType = 'source';\n\n options: IRemoteStrapiSourceProviderOptions;\n\n ws: WebSocket | null;\n\n dispatcher: ReturnType<typeof createDispatcher> | null;\n\n defaultOptions: Partial<IRemoteStrapiSourceProviderOptions> = {\n // Large files + JSON/WS backpressure can go minutes between *messages* while bytes still drain locally\n streamTimeout: 300_000,\n };\n\n constructor(options: IRemoteStrapiSourceProviderOptions) {\n this.options = {\n ...this.defaultOptions,\n ...options,\n };\n this.#checksumsEnabled = this.options.verifyChecksums === true;\n\n this.ws = null;\n this.dispatcher = null;\n }\n\n results?: ISourceProviderTransferResults | undefined;\n\n #diagnostics?: IDiagnosticReporter;\n\n #pullAssetStreamWireSampleLogged = false;\n\n #checksumsEnabled = false;\n\n /** Set from pull server `start` response for `assets` when present (for engine `getStageTotals`). */\n #cachedAssetsTotals?: StageTotalsEstimate;\n\n async #createStageReadStream(stage: Exclude<TransferStage, 'schemas'>) {\n if (stage === 'assets') {\n this.#cachedAssetsTotals = undefined;\n }\n\n const startResult = await this.#startStep(stage);\n\n if (startResult instanceof Error) {\n throw startResult;\n }\n\n const { id: processID, totals } = startResult as {\n id: string;\n totals?: StageTotalsEstimate;\n };\n\n if (stage === 'assets' && totals && (totals.totalBytes != null || totals.totalCount != null)) {\n this.#cachedAssetsTotals = totals;\n }\n\n // Default object-mode HWM (~16 chunks). Do not await `drain` on manual `push` while `pipe()`\n // is attached — drain/`readableLength` races reliably deadlock after a few 1MiB asset frames.\n // Backpressure for pull assets is enforced by the Writable below (`highWaterMark: 1`).\n const stream = new PassThrough({ objectMode: true });\n\n const listener = async (raw: Buffer) => {\n const parsed = JSON.parse(raw.toString());\n // If not a message related to our transfer process, ignore it\n if (!parsed.uuid || parsed?.data?.type !== 'transfer' || parsed?.data?.id !== processID) {\n this.ws?.once('message', listener);\n return;\n }\n\n const { uuid, data: message } = parsed;\n const { ended, error, data } = message;\n\n if (error) {\n await this.#respond(uuid);\n stream.destroy(error);\n return;\n }\n\n if (ended) {\n await this.#respond(uuid);\n await this.#endStep(stage);\n\n stream.end();\n return;\n }\n\n for (const item of Array.isArray(data) ? data : [data]) {\n stream.push(item as Parameters<PassThrough['push']>[0]);\n }\n\n this.ws?.once('message', listener);\n\n await this.#respond(uuid);\n };\n\n this.ws?.once('message', listener);\n\n return stream;\n }\n\n createEntitiesReadStream(): MaybePromise<Readable> {\n return this.#createStageReadStream('entities');\n }\n\n createLinksReadStream(): MaybePromise<Readable> {\n return this.#createStageReadStream('links');\n }\n\n async createAssetsReadStream(): Promise<Readable> {\n // Create the streams used to transfer the assets\n const stream = await this.#createStageReadStream('assets');\n const pass = new PassThrough({ objectMode: true });\n\n // Init the asset map\n const assets: {\n // TODO: could we include filename in this for improved logging?\n [assetID: string]: IAsset & {\n stream: PassThrough;\n queue: Array<QueueableAction>;\n status: 'ok' | 'closed' | 'errored';\n timeout?: NodeJS.Timeout;\n checksumHash?: Hash;\n };\n } = {};\n\n // Watch for stalled assets: no remote chunks and no completed writes to the asset stream for streamTimeout ms\n const resetTimeout = (assetID: string) => {\n if (!assets[assetID]) {\n return;\n }\n if (assets[assetID].timeout) {\n clearTimeout(assets[assetID].timeout);\n }\n assets[assetID].timeout = setTimeout(() => {\n if (!assets[assetID]) {\n return;\n }\n this.#reportInfo(`Asset ${assetID} transfer stalled, aborting.`);\n assets[assetID].status = 'errored';\n assets[assetID].stream.destroy(new Error(`Asset ${assetID} transfer timed out`));\n }, this.options.streamTimeout);\n };\n\n const clearStallTimeoutForAsset = (assetID: string) => {\n const entry = assets[assetID];\n if (entry?.timeout) {\n clearTimeout(entry.timeout);\n entry.timeout = undefined;\n }\n };\n\n const clearAllStallTimeouts = () => {\n for (const id of Object.keys(assets)) {\n clearStallTimeoutForAsset(id);\n }\n };\n\n /**\n * Serialize asset batch handling: `Readable.on('data', async …)` does not apply backpressure,\n * so we pipe through a Writable with highWaterMark 1 so only one batch is in flight.\n */\n const processAssetPayload = async (payload: Protocol.Client.TransferAssetFlow[]) => {\n for (const item of payload) {\n const { action, assetID } = item;\n\n if (action === 'start') {\n if (assets[assetID]) {\n throw new Error(`Asset ${assetID} already started`);\n }\n\n this.#reportInfo(`Asset ${assetID} starting`);\n assets[assetID] = {\n ...item.data,\n stream: new PassThrough(),\n status: 'ok',\n queue: [],\n ...(this.#checksumsEnabled ? { checksumHash: createHash('sha256') } : {}),\n };\n\n resetTimeout(assetID);\n\n await write(pass, assets[assetID]);\n } else if (action === 'stream' || action === 'end') {\n if (!assets[assetID]) {\n throw new Error(`No id matching ${assetID} for stream action`);\n }\n\n if (action === 'stream') {\n if (!this.#pullAssetStreamWireSampleLogged) {\n this.#pullAssetStreamWireSampleLogged = true;\n const { data } = item;\n // Same legacy shape `decodeTransferAssetStreamData` accepts after JSON.parse (proof, not frame-size guess).\n const legacyBufferJson =\n data &&\n typeof data === 'object' &&\n !Buffer.isBuffer(data) &&\n (data as { type?: string }).type === 'Buffer' &&\n (Array.isArray((data as { data?: unknown }).data) ||\n ArrayBuffer.isView((data as { data?: unknown }).data));\n if (legacyBufferJson) {\n this.#reportWarning(\n '[Data transfer][pull] Remote is using legacy Buffer JSON for asset chunks (each byte as a JSON number). That uses much more memory during JSON.parse than base64. Upgrade the remote Strapi to a version that sends base64 asset chunks, or out-of-memory errors may still happen on large files.'\n );\n }\n }\n resetTimeout(assetID);\n } else {\n clearTimeout(assets[assetID].timeout);\n }\n\n if (assets[assetID].status === 'closed') {\n throw new Error(`Asset ${assetID} is closed`);\n }\n\n assets[assetID].queue.push(item);\n }\n }\n\n for (const assetID in assets) {\n if (Object.prototype.hasOwnProperty.call(assets, assetID)) {\n const asset = assets[assetID];\n if (asset.queue?.length > 0) {\n await processQueue(assetID);\n }\n }\n }\n };\n\n const processor = new Writable({\n objectMode: true,\n highWaterMark: 1,\n write(payload: Protocol.Client.TransferAssetFlow[], _encoding, callback) {\n processAssetPayload(payload).then(\n () => {\n callback();\n },\n (err: Error) => {\n clearAllStallTimeouts();\n stream.destroy(err);\n callback(err);\n }\n );\n },\n final(callback) {\n pass.end();\n callback();\n },\n });\n\n processor.on('error', (err) => {\n clearAllStallTimeouts();\n pass.destroy(err);\n });\n\n stream.on('error', (err) => {\n clearAllStallTimeouts();\n processor.destroy(err);\n pass.destroy(err);\n });\n\n stream.once('end', () => {\n clearAllStallTimeouts();\n });\n\n stream.pipe(processor);\n\n /**\n * Start processing the queue for a given assetID\n *\n * Even though this is a loop that attempts to process the entire queue, it is safe to call this more than once\n * for the same asset id because the queue is shared globally, the items are shifted off, and immediately written\n */\n const processQueue = async (id: string) => {\n if (!assets[id]) {\n throw new Error(`Failed to write asset chunk for \"${id}\". Asset not found.`);\n }\n\n const asset = assets[id];\n const { status: currentStatus } = asset;\n\n if (['closed', 'errored'].includes(currentStatus)) {\n throw new Error(\n `Failed to write asset chunk for \"${id}\". The asset is currently \"${currentStatus}\"`\n );\n }\n\n while (asset.queue.length > 0) {\n const data = asset.queue.shift();\n\n if (!data) {\n throw new Error(`Invalid chunk found for ${id}`);\n }\n\n try {\n // if this is an end chunk, close the asset stream\n if (data.action === 'end') {\n this.#reportInfo(`Ending asset stream for ${id}`);\n await closeAssetStream(id, data.checksum);\n break; // Exit the loop after closing the stream\n }\n\n // Save the current chunk\n await writeChunkToStream(id, data);\n } catch (error) {\n if (!assets[id]) {\n throw new Error(`No id matching ${id} for writeAssetChunk`);\n }\n clearStallTimeoutForAsset(id);\n if (error instanceof Error) {\n throw error;\n }\n throw new Error(`Unexpected error while processing asset chunk for \"${id}\"`);\n }\n }\n };\n\n /**\n * Writes a chunk of data to the asset's stream.\n *\n * Only check if the targeted asset exists, no other validation is done.\n */\n const writeChunkToStream = async (id: string, item: QueueableAction) => {\n const asset = assets[id];\n\n if (!asset) {\n throw new Error(`Failed to write asset chunk for \"${id}\". Asset not found.`);\n }\n\n if (item.action !== 'stream') {\n throw new Error(`Expected stream queue item for \"${id}\"`);\n }\n const chunk = decodeTransferAssetStreamItem(item);\n asset.checksumHash?.update(chunk);\n\n await write(asset.stream, chunk);\n // Count slow draining as progress so backpressure on large chunks does not trip the stall timer\n resetTimeout(id);\n };\n\n /**\n * Closes the asset stream associated with the given ID.\n *\n * It deletes the stream for the asset upon successful closure.\n */\n const closeAssetStream = async (\n id: string,\n checksum?: { algorithm: 'sha256'; value: string }\n ) => {\n if (!assets[id]) {\n throw new Error(`Failed to close asset \"${id}\". Asset not found.`);\n }\n\n const asset = assets[id];\n // The queue processes stream chunks before `end`; the last `writeChunkToStream` calls\n // `resetTimeout` after the `end` chunk already cleared the timer — clear again before closing.\n clearStallTimeoutForAsset(id);\n\n if (this.#checksumsEnabled) {\n if (!checksum) {\n throw new ProviderTransferError(\n `Asset ${id} is missing checksum in transfer end payload`\n );\n }\n if (checksum.algorithm !== 'sha256') {\n throw new ProviderTransferError(\n `Asset ${id} checksum algorithm \"${checksum.algorithm}\" is not supported`\n );\n }\n const actual = asset.checksumHash?.digest('hex');\n if (!actual || actual !== checksum.value) {\n throw new ProviderTransferError(\n `Checksum mismatch for asset \"${id}\" (expected ${checksum.value}, got ${actual ?? 'none'})`\n );\n }\n }\n asset.status = 'closed';\n\n await new Promise<void>((resolve, reject) => {\n const { stream } = asset;\n\n stream\n .on('close', () => {\n delete assets[id];\n resolve();\n })\n .on('error', (e) => {\n delete assets[id];\n reject(new Error(`Failed to close asset \"${id}\". Asset stream error: ${e.toString()}`));\n })\n .end();\n });\n };\n\n return pass;\n }\n\n createConfigurationReadStream(): MaybePromise<Readable> {\n return this.#createStageReadStream('configuration');\n }\n\n async getMetadata(): Promise<IMetadata | null> {\n const metadata = await this.dispatcher?.dispatchTransferAction<IMetadata>('getMetadata');\n\n return metadata ?? null;\n }\n\n assertValidProtocol(url: URL) {\n const validProtocols = ['https:', 'http:'];\n\n if (!validProtocols.includes(url.protocol)) {\n throw new ProviderValidationError(`Invalid protocol \"${url.protocol}\"`, {\n check: 'url',\n details: {\n protocol: url.protocol,\n validProtocols,\n },\n });\n }\n }\n\n async initTransfer(): Promise<string> {\n const wantsChecksums = this.options.verifyChecksums === true;\n const query = this.dispatcher?.dispatchCommand({\n command: 'init',\n ...(wantsChecksums ? { params: { transfer: 'pull', checksums: true } } : {}),\n });\n\n const res = (await query) as\n (Server.Payload<Server.InitMessage> & { checksums?: boolean }) | null;\n\n if (!res?.transferID) {\n throw new ProviderTransferError('Init failed, invalid response from the server');\n }\n this.#checksumsEnabled = wantsChecksums && res.checksums === true;\n if (wantsChecksums && res.checksums !== true) {\n this.#reportWarning(\n '[Data transfer][pull] Checksums were requested but the remote does not support checksum negotiation; continuing without checksum validation.'\n );\n }\n\n return res.transferID;\n }\n\n #reportInfo(message: string) {\n this.#diagnostics?.report({\n details: {\n createdAt: new Date(),\n message,\n origin: 'remote-source-provider',\n },\n kind: 'info',\n });\n }\n\n /** Reports a warning diagnostic (`kind: 'warning'`). Consumers (e.g. CLI) choose log levels and routing. */\n #reportWarning(message: string) {\n this.#diagnostics?.report({\n details: {\n createdAt: new Date(),\n message,\n origin: 'remote-source-provider',\n },\n kind: 'warning',\n });\n }\n\n async bootstrap(diagnostics?: IDiagnosticReporter): Promise<void> {\n this.#diagnostics = diagnostics;\n const { url, auth } = this.options;\n let ws: WebSocket;\n this.assertValidProtocol(url);\n const wsProtocol = url.protocol === 'https:' ? 'wss:' : 'ws:';\n const wsUrl = `${wsProtocol}//${url.host}${trimTrailingSlash(\n url.pathname\n )}${TRANSFER_PATH}/pull`;\n\n this.#pullAssetStreamWireSampleLogged = false;\n\n this.#reportInfo('establishing websocket connection');\n // No auth defined, trying public access for transfer\n if (!auth) {\n ws = await connectToWebsocket(wsUrl, undefined, this.#diagnostics);\n }\n\n // Common token auth, this should be the main auth method\n else if (auth.type === 'token') {\n const headers = { Authorization: `Bearer ${auth.token}` };\n ws = await connectToWebsocket(wsUrl, { headers }, this.#diagnostics);\n }\n\n // Invalid auth method provided\n else {\n throw new ProviderValidationError('Auth method not available', {\n check: 'auth.type',\n details: {\n auth: auth.type,\n },\n });\n }\n\n this.#reportInfo('established websocket connection');\n this.ws = ws;\n const { retryMessageOptions } = this.options;\n\n this.#reportInfo('creating dispatcher');\n this.dispatcher = createDispatcher(this.ws, retryMessageOptions, (message: string) =>\n this.#reportInfo(message)\n );\n this.#reportInfo('created dispatcher');\n\n this.#reportInfo('initialize transfer');\n const transferID = await this.initTransfer();\n this.#reportInfo(`initialized transfer ${transferID}`);\n\n this.dispatcher.setTransferProperties({ id: transferID, kind: 'pull' });\n await this.dispatcher.dispatchTransferAction('bootstrap');\n }\n\n async close() {\n await this.dispatcher?.dispatchTransferAction('close');\n\n await new Promise<void>((resolve) => {\n const { ws } = this;\n\n if (!ws || ws.CLOSED) {\n resolve();\n return;\n }\n\n ws.on('close', () => resolve()).close();\n });\n }\n\n async getSchemas() {\n const schemas =\n await this.dispatcher?.dispatchTransferAction<Utils.String.Dict<Struct.Schema>>('getSchemas');\n\n return schemas ?? null;\n }\n\n async getStageTotals(stage: TransferStage): Promise<StageTotalsEstimate | null> {\n if (stage !== 'assets') {\n return null;\n }\n const cached = this.#cachedAssetsTotals;\n return cached ?? null;\n }\n\n async #startStep<T extends Client.TransferPullStep>(step: T) {\n try {\n return await this.dispatcher?.dispatchTransferStep(\n { action: 'start', step },\n step === 'assets' ? { retryOverrides: ASSETS_START_RETRY_OVERRIDES } : undefined\n );\n } catch (e) {\n if (e instanceof Error) {\n return e;\n }\n\n if (typeof e === 'string') {\n return new ProviderTransferError(e);\n }\n\n return new ProviderTransferError('Unexpected error');\n }\n }\n\n async #respond(uuid: string) {\n return new Promise((resolve, reject) => {\n this.ws?.send(JSON.stringify({ uuid }), (e) => {\n if (e) {\n reject(e);\n } else {\n resolve(e);\n }\n });\n });\n }\n\n async #endStep<T extends Client.TransferPullStep>(step: T) {\n try {\n await this.dispatcher?.dispatchTransferStep({ action: 'end', step });\n } catch (e) {\n if (e instanceof Error) {\n return e;\n }\n\n if (typeof e === 'string') {\n return new ProviderTransferError(e);\n }\n\n return new ProviderTransferError('Unexpected error');\n }\n\n return null;\n }\n}\n\nexport const createRemoteStrapiSourceProvider = (options: IRemoteStrapiSourceProviderOptions) => {\n return new RemoteStrapiSourceProvider(options);\n};\n"],"names":["ASSETS_START_RETRY_OVERRIDES","retryMessageTimeout","retryMessageMaxRetries","RemoteStrapiSourceProvider","createEntitiesReadStream","createLinksReadStream","createAssetsReadStream","stream","pass","PassThrough","objectMode","assets","resetTimeout","assetID","timeout","clearTimeout","setTimeout","status","destroy","Error","options","streamTimeout","clearStallTimeoutForAsset","entry","undefined","clearAllStallTimeouts","id","Object","keys","processAssetPayload","payload","item","action","data","queue","checksumHash","createHash","write","legacyBufferJson","Buffer","isBuffer","type","Array","isArray","ArrayBuffer","isView","push","prototype","hasOwnProperty","call","asset","length","processQueue","processor","Writable","highWaterMark","_encoding","callback","then","err","final","end","on","once","pipe","currentStatus","includes","shift","closeAssetStream","checksum","writeChunkToStream","error","chunk","decodeTransferAssetStreamItem","update","ProviderTransferError","algorithm","actual","digest","value","Promise","resolve","reject","e","toString","createConfigurationReadStream","getMetadata","metadata","dispatcher","dispatchTransferAction","assertValidProtocol","url","validProtocols","protocol","ProviderValidationError","check","details","initTransfer","wantsChecksums","verifyChecksums","query","dispatchCommand","command","params","transfer","checksums","res","transferID","bootstrap","diagnostics","auth","ws","wsProtocol","wsUrl","host","trimTrailingSlash","pathname","TRANSFER_PATH","connectToWebsocket","headers","Authorization","token","retryMessageOptions","createDispatcher","message","setTransferProperties","kind","close","CLOSED","getSchemas","schemas","getStageTotals","stage","cached","name","defaultOptions","startResult","processID","totals","totalBytes","totalCount","listener","raw","parsed","JSON","parse","uuid","ended","report","createdAt","Date","origin","step","dispatchTransferStep","retryOverrides","send","stringify","createRemoteStrapiSourceProvider"],"mappings":"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"}