{"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  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  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      },\n    });\n\n    const res = (await query) as\n      | (Server.Payload<Server.InitMessage> & { checksums?: boolean })\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    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\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(createTransferAssetStreamChunk(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","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","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","createTransferAssetStreamChunk","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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"}