UNPKG

@strapi/data-transfer

Version:

Data transfer capabilities for Strapi

1 lines 33.8 kB
{"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/fp';\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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"}