{"version":3,"file":"push.mjs","sources":["../../../../src/strapi/remote/handlers/push.ts"],"sourcesContent":["import { randomUUID } from 'crypto';\nimport { Writable, PassThrough } from 'stream';\nimport type { Core } from '@strapi/types';\n\nimport type { TransferFlow, Step } from '../flows';\nimport type { TransferStage, IAsset, Protocol } from '../../../../types';\n\nimport { ProviderTransferError } from '../../../errors/providers';\nimport { createLocalStrapiDestinationProvider } from '../../providers';\nimport { createFlow, DEFAULT_TRANSFER_FLOW } from '../flows';\nimport { Handler } from './abstract';\nimport { handlerControllerFactory, isDataTransferMessage } from './utils';\n\nconst VALID_TRANSFER_ACTIONS = [\n  'bootstrap',\n  'close',\n  'rollback',\n  'beforeTransfer',\n  'getMetadata',\n  'getSchemas',\n] as const;\n\ntype PushTransferAction = (typeof VALID_TRANSFER_ACTIONS)[number];\n\nconst TRANSFER_KIND = 'push';\n\nexport interface PushHandler extends Handler {\n  /**\n   * Local Strapi Destination Provider used to write data to the current Strapi instance\n   */\n  provider?: ReturnType<typeof createLocalStrapiDestinationProvider>;\n\n  /**\n   * Holds all the stages' stream for the current transfer handler (one registry per connection)\n   */\n  streams?: { [stage in TransferStage]?: Writable };\n\n  stats: {\n    [stage in Exclude<TransferStage, 'schemas'>]: Protocol.Client.Stats;\n  };\n\n  /**\n   * Holds all the transferred assets for the current transfer handler (one registry per connection)\n   */\n  assets: { [filepath: string]: IAsset & { stream: PassThrough } };\n\n  /**\n   * Ochestrate and manage the transfer messages' ordering\n   */\n  flow?: TransferFlow;\n\n  /**\n   * Checks that the given action is a valid push transfer action\n   */\n  assertValidTransferAction(action: string): asserts action is PushTransferAction;\n\n  /**\n   * Create a new writable stream for the given step in the handler's stream registry\n   */\n  createWritableStreamForStep(step: TransferStage): Promise<void>;\n\n  /**\n   * Simple override of the auth verification\n   */\n  verifyAuth(): Promise<void>;\n\n  /**\n   * Callback when receiving a regular transfer message\n   */\n  onTransferMessage(msg: Protocol.Client.TransferMessage): Promise<unknown> | unknown;\n\n  /**\n   * Callback when receiving a transfer action message\n   */\n  onTransferAction(msg: Protocol.Client.Action): Promise<unknown> | unknown;\n\n  /**\n   * Callback when receiving a transfer step message\n   */\n  onTransferStep(msg: Protocol.Client.TransferPushMessage): Promise<unknown> | unknown;\n\n  /**\n   * Start streaming an asset\n   */\n  streamAsset(\n    this: PushHandler,\n    payload: Protocol.Client.GetTransferPushStreamData<'assets'>\n  ): Promise<void>;\n\n  // Transfer Flow\n\n  /**\n   * Try to move to a specific transfer stage & lock the step\n   */\n  lockTransferStep(stage: TransferStage): void;\n\n  /**\n   * Try to move to unlock the current step\n   */\n  unlockTransferStep(stage: TransferStage): void;\n\n  /**\n   * Checks whether it's possible to stream a chunk for the given stage\n   */\n  assertValidStreamTransferStep(stage: TransferStage): void;\n}\n\nconst writeAsync = <T>(stream: Writable, data: T) => {\n  return new Promise<void>((resolve, reject) => {\n    stream.write(data, (error) => {\n      if (error) {\n        reject(error);\n      }\n\n      resolve();\n    });\n  });\n};\n\nexport const createPushController = handlerControllerFactory<Partial<PushHandler>>((proto) => ({\n  isTransferStarted(this: PushHandler) {\n    return proto.isTransferStarted.call(this) && this.provider !== undefined;\n  },\n\n  verifyAuth(this: PushHandler) {\n    return proto.verifyAuth.call(this, TRANSFER_KIND);\n  },\n  onInfo(message) {\n    this.diagnostics?.report({\n      details: {\n        message,\n        origin: 'push-handler',\n        createdAt: new Date(),\n      },\n      kind: 'info',\n    });\n  },\n  onWarning(message) {\n    this.diagnostics?.report({\n      details: {\n        message,\n        createdAt: new Date(),\n        origin: 'push-handler',\n      },\n      kind: 'warning',\n    });\n  },\n  cleanup(this: PushHandler) {\n    proto.cleanup.call(this);\n\n    this.streams = {};\n    this.assets = {};\n\n    delete this.flow;\n    delete this.provider;\n  },\n\n  teardown(this: PushHandler) {\n    if (this.provider) {\n      this.provider.rollback();\n    }\n\n    proto.teardown.call(this);\n  },\n\n  assertValidTransfer(this: PushHandler) {\n    proto.assertValidTransfer.call(this);\n\n    if (this.provider === undefined) {\n      throw new Error('Invalid Transfer Process');\n    }\n  },\n\n  assertValidTransferAction(this: PushHandler, action: PushTransferAction) {\n    if (VALID_TRANSFER_ACTIONS.includes(action)) {\n      return;\n    }\n\n    throw new ProviderTransferError(`Invalid action provided: \"${action}\"`, {\n      action,\n      validActions: Object.keys(VALID_TRANSFER_ACTIONS),\n    });\n  },\n\n  assertValidStreamTransferStep(this: PushHandler, stage) {\n    const currentStep = this.flow?.get();\n    const nextStep: Step = { kind: 'transfer', stage };\n\n    if (currentStep?.kind === 'transfer' && !currentStep.locked) {\n      throw new ProviderTransferError(\n        `You need to initialize the transfer stage (${nextStep}) before starting to stream data`\n      );\n    }\n\n    if (this.flow?.cannot(nextStep)) {\n      throw new ProviderTransferError(`Invalid stage (${nextStep}) provided for the current flow`, {\n        step: nextStep,\n      });\n    }\n  },\n\n  async createWritableStreamForStep(this: PushHandler, step: Exclude<TransferStage, 'schemas'>) {\n    const mapper = {\n      entities: () => this.provider?.createEntitiesWriteStream(),\n      links: () => this.provider?.createLinksWriteStream(),\n      configuration: () => this.provider?.createConfigurationWriteStream(),\n      assets: () => this.provider?.createAssetsWriteStream(),\n    };\n\n    if (!(step in mapper)) {\n      throw new Error('Invalid transfer step, impossible to create a stream');\n    }\n\n    if (!this.streams) {\n      throw new Error('Invalid transfer state');\n    }\n\n    this.streams[step] = await mapper[step]();\n  },\n\n  async onMessage(this: PushHandler, raw) {\n    const msg = JSON.parse(raw.toString());\n\n    if (!isDataTransferMessage(msg)) {\n      return;\n    }\n\n    if (!msg.uuid) {\n      await this.respond(undefined, new Error('Missing uuid in message'));\n    }\n\n    if (proto.hasUUID(msg.uuid)) {\n      const previousResponse = proto.response;\n      if (previousResponse?.uuid === msg.uuid) {\n        await this.respond(previousResponse?.uuid, previousResponse.e, previousResponse.data);\n      }\n      return;\n    }\n\n    const { uuid, type } = msg;\n    proto.addUUID(uuid);\n    // Regular command message (init, end, status)\n    if (type === 'command') {\n      const { command } = msg;\n      this.onInfo(`received command:${command} uuid:${uuid}`);\n      await this.executeAndRespond(uuid, () => {\n        this.assertValidTransferCommand(command);\n\n        // The status command don't have params\n        if (command === 'status') {\n          return this.status();\n        }\n        return this[command](msg.params);\n      });\n    }\n\n    // Transfer message (the transfer must be init first)\n    else if (type === 'transfer') {\n      this.onInfo(`received transfer action:${msg.action} step:${msg.kind} uuid:${uuid}`);\n      await this.executeAndRespond(uuid, async () => {\n        await this.verifyAuth();\n\n        this.assertValidTransfer();\n\n        return this.onTransferMessage(msg);\n      });\n    }\n\n    // Invalid messages\n    else {\n      await this.respond(uuid, new Error('Bad Request'));\n    }\n  },\n\n  async onTransferMessage(this: PushHandler, msg) {\n    const { kind } = msg;\n\n    if (kind === 'action') {\n      return this.onTransferAction(msg);\n    }\n\n    if (kind === 'step') {\n      return this.onTransferStep(msg as Protocol.Client.TransferPushMessage);\n    }\n  },\n\n  lockTransferStep(stage: TransferStage) {\n    const currentStep = this.flow?.get();\n    const nextStep: Step = { kind: 'transfer', stage };\n\n    if (currentStep?.kind === 'transfer' && currentStep.locked) {\n      throw new ProviderTransferError(\n        `It's not possible to start a new transfer stage (${stage}) while another one is in progress (${currentStep.stage})`\n      );\n    }\n\n    if (this.flow?.cannot(nextStep)) {\n      throw new ProviderTransferError(`Invalid stage (${stage}) provided for the current flow`, {\n        step: nextStep,\n      });\n    }\n\n    this.flow?.set({ ...nextStep, locked: true });\n  },\n\n  unlockTransferStep(stage: TransferStage) {\n    const currentStep = this.flow?.get();\n    const nextStep: Step = { kind: 'transfer', stage };\n\n    // Cannot unlock if not locked (aka: started)\n    if (currentStep?.kind === 'transfer' && !currentStep.locked) {\n      throw new ProviderTransferError(\n        `You need to initialize the transfer stage (${stage}) before ending it`\n      );\n    }\n\n    // Cannot unlock if invalid step provided\n    if (this.flow?.cannot(nextStep)) {\n      throw new ProviderTransferError(`Invalid stage (${stage}) provided for the current flow`, {\n        step: nextStep,\n      });\n    }\n\n    this.flow?.set({ ...nextStep, locked: false });\n  },\n\n  async onTransferStep(this: PushHandler, msg) {\n    const { step: stage } = msg;\n\n    if (msg.action === 'start') {\n      this.lockTransferStep(stage);\n\n      if (this.streams?.[stage] instanceof Writable) {\n        throw new Error('Stream already created, something went wrong');\n      }\n\n      await this.createWritableStreamForStep(stage);\n\n      this.stats[stage] = { started: 0, finished: 0 };\n\n      return { ok: true };\n    }\n\n    if (msg.action === 'stream') {\n      this.assertValidStreamTransferStep(stage);\n\n      // Stream operation on the current transfer stage\n      const stream = this.streams?.[stage];\n\n      if (!stream) {\n        throw new Error('You need to init first');\n      }\n\n      // Assets are nested streams\n      if (stage === 'assets') {\n        return this.streamAsset(msg.data);\n      }\n\n      // For all other steps\n      await Promise.all(\n        msg.data.map(async (item) => {\n          this.stats[stage].started += 1;\n          await writeAsync(stream, item);\n          this.stats[stage].finished += 1;\n        })\n      );\n    }\n\n    if (msg.action === 'end') {\n      this.unlockTransferStep(stage);\n      const stream = this.streams?.[stage];\n\n      if (stream && !stream.closed) {\n        await new Promise((resolve, reject) => {\n          stream.on('close', resolve).on('error', reject).end();\n        });\n      }\n\n      delete this.streams?.[stage];\n\n      return { ok: true, stats: this.stats[stage] };\n    }\n  },\n\n  async onTransferAction(this: PushHandler, msg) {\n    const { action } = msg;\n\n    this.assertValidTransferAction(action);\n\n    const step: Step = { kind: 'action', action };\n    const isStepRegistered = this.flow?.has(step);\n\n    if (isStepRegistered) {\n      if (this.flow?.cannot(step)) {\n        throw new ProviderTransferError(`Invalid action \"${action}\" found for the current flow `, {\n          action,\n        });\n      }\n\n      this.flow?.set(step);\n    }\n    if (action === 'bootstrap') {\n      return this.provider?.[action](this.diagnostics);\n    }\n    return this.provider?.[action]();\n  },\n\n  async streamAsset(this: PushHandler, payload) {\n    const assetsStream = this.streams?.assets;\n\n    // TODO: close the stream upon receiving an 'end' event instead\n    if (payload === null) {\n      this.streams?.assets?.end();\n      return;\n    }\n\n    for (const item of payload) {\n      const { action, assetID } = item;\n\n      if (!assetsStream) {\n        throw new Error('Stream not defined');\n      }\n\n      if (action === 'start') {\n        this.stats.assets.started += 1;\n        this.assets[assetID] = { ...item.data, stream: new PassThrough() };\n        writeAsync(assetsStream, this.assets[assetID]);\n      }\n\n      if (action === 'stream') {\n        // The buffer has gone through JSON operations and is now of shape { type: \"Buffer\"; data: UInt8Array }\n        // We need to transform it back into a Buffer instance\n        const rawBuffer = item.data as unknown as { type: 'Buffer'; data: Uint8Array };\n        const chunk = Buffer.from(rawBuffer.data);\n        await writeAsync(this.assets[assetID].stream, chunk);\n      }\n\n      if (action === 'end') {\n        await new Promise<void>((resolve, reject) => {\n          const { stream: assetStream } = this.assets[assetID];\n          assetStream\n            .on('close', () => {\n              this.stats.assets.finished += 1;\n              delete this.assets[assetID];\n              resolve();\n            })\n            .on('error', reject)\n            .end();\n        });\n      }\n    }\n  },\n\n  onClose(this: Handler) {\n    this.teardown();\n  },\n\n  onError(this: Handler, err) {\n    this.teardown();\n    strapi.log.error(err);\n  },\n\n  // Commands\n\n  async init(\n    this: PushHandler,\n    params: Protocol.Client.GetCommandParams<'init'>\n  ): Promise<Protocol.Server.Payload<Protocol.Server.InitMessage>> {\n    if (this.transferID || this.provider) {\n      throw new Error('Transfer already in progress');\n    }\n\n    await this.verifyAuth();\n\n    this.transferID = randomUUID();\n    this.startedAt = Date.now();\n\n    this.assets = {};\n    this.streams = {};\n    this.stats = {\n      assets: { started: 0, finished: 0 },\n      configuration: { started: 0, finished: 0 },\n      entities: { started: 0, finished: 0 },\n      links: { started: 0, finished: 0 },\n    };\n\n    this.flow = createFlow(DEFAULT_TRANSFER_FLOW);\n\n    this.provider = createLocalStrapiDestinationProvider({\n      ...params.options,\n      autoDestroy: false,\n      getStrapi: () => strapi as Core.Strapi,\n    });\n\n    this.provider.onWarning = (message) => {\n      this.onWarning(message);\n      strapi.log.warn(message);\n    };\n\n    return { transferID: this.transferID };\n  },\n\n  async status(this: PushHandler) {\n    const isStarted = this.isTransferStarted();\n\n    if (isStarted) {\n      const startedAt = this.startedAt as number;\n\n      return {\n        active: true,\n        kind: TRANSFER_KIND,\n        startedAt,\n        elapsed: Date.now() - startedAt,\n      };\n    }\n\n    return { active: false, kind: null, elapsed: null, startedAt: null };\n  },\n\n  async end(\n    this: PushHandler,\n    params: Protocol.Client.GetCommandParams<'end'>\n  ): Promise<Protocol.Server.Payload<Protocol.Server.EndMessage>> {\n    await this.verifyAuth();\n\n    if (this.transferID !== params?.transferID) {\n      throw new ProviderTransferError('Bad transfer ID provided');\n    }\n\n    this.cleanup();\n\n    return { ok: true };\n  },\n}));\n"],"names":["VALID_TRANSFER_ACTIONS","TRANSFER_KIND","writeAsync","stream","data","Promise","resolve","reject","write","error","createPushController","handlerControllerFactory","proto","isTransferStarted","call","provider","undefined","verifyAuth","onInfo","message","diagnostics","report","details","origin","createdAt","Date","kind","onWarning","cleanup","streams","assets","flow","teardown","rollback","assertValidTransfer","Error","assertValidTransferAction","action","includes","ProviderTransferError","validActions","Object","keys","assertValidStreamTransferStep","stage","currentStep","get","nextStep","locked","cannot","step","createWritableStreamForStep","mapper","entities","createEntitiesWriteStream","links","createLinksWriteStream","configuration","createConfigurationWriteStream","createAssetsWriteStream","onMessage","raw","msg","JSON","parse","toString","isDataTransferMessage","uuid","respond","hasUUID","previousResponse","response","e","type","addUUID","command","executeAndRespond","assertValidTransferCommand","status","params","onTransferMessage","onTransferAction","onTransferStep","lockTransferStep","set","unlockTransferStep","Writable","stats","started","finished","ok","streamAsset","all","map","item","closed","on","end","isStepRegistered","has","payload","assetsStream","assetID","PassThrough","rawBuffer","chunk","Buffer","from","assetStream","onClose","onError","err","strapi","log","init","transferID","randomUUID","startedAt","now","createFlow","DEFAULT_TRANSFER_FLOW","createLocalStrapiDestinationProvider","options","autoDestroy","getStrapi","warn","isStarted","active","elapsed"],"mappings":"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"}