UNPKG

@strapi/data-transfer

Version:

Data transfer capabilities for Strapi

1 lines • 28.7 kB
{"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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"}