UNPKG

@strapi/data-transfer

Version:

Data transfer capabilities for Strapi

1 lines • 25.5 kB
{"version":3,"file":"index.mjs","sources":["../../../../src/strapi/providers/remote-destination/index.ts"],"sourcesContent":["import { 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';\n\nexport interface IRemoteStrapiDestinationProviderOptions\n extends Pick<ILocalStrapiDestinationProviderOptions, 'restore' | 'strategy'> {\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}\n\nconst jsonLength = (obj: object) => Buffer.byteLength(JSON.stringify(obj));\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 constructor(options: IRemoteStrapiDestinationProviderOptions) {\n this.options = options;\n this.ws = null;\n this.dispatcher = null;\n this.transferID = null;\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\n const query = this.dispatcher?.dispatchCommand({\n command: 'init',\n params: { options: { strategy, restore }, transfer: 'push' },\n });\n\n const res = (await query) as Server.Payload<Server.InitMessage>;\n if (!res?.transferID) {\n throw new ProviderTransferError('Init failed, invalid response from the server');\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 batchSize = 1024 * 1024; // 1MB;\n const startTransferOnce = this.#startStepOnce(step);\n\n let batch = [] as Client.GetTransferPushStreamData<Step>;\n\n const batchLength = () => jsonLength(batch);\n\n return new Writable({\n objectMode: true,\n\n final: async (callback) => {\n if (batch.length > 0) {\n const streamError = await this.#streamStep(step, batch);\n\n batch = [];\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}, recieved ${stats.started} and saved ${stats.finished} ${step}`\n )\n );\n }\n\n callback(error);\n },\n\n write: async (chunk, _encoding, callback) => {\n const startError = await startTransferOnce();\n if (startError) {\n return callback(startError);\n }\n\n batch.push(chunk);\n\n if (batchLength() >= batchSize) {\n const streamError = await this.#streamStep(step, batch);\n\n batch = [];\n\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 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 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\n const batchSize = 1024 * 1024; // 1MB;\n const batchLength = () => {\n return batch.reduce(\n (acc, chunk) => (chunk.action === 'stream' ? acc + chunk.data.byteLength : acc),\n 0\n );\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\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 await safePush({ action: 'stream', assetID, data: chunk });\n }\n\n await safePush({ action: 'end', assetID });\n\n callback();\n } catch (error) {\n if (error instanceof Error) {\n callback(error);\n }\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","RemoteStrapiDestinationProvider","resetStats","stats","assets","count","entities","links","configuration","initTransfer","strategy","restore","options","query","dispatcher","dispatchCommand","command","params","transfer","res","transferID","ProviderTransferError","bootstrap","diagnostics","url","auth","validProtocols","ws","includes","protocol","ProviderValidationError","check","details","wsProtocol","wsUrl","host","trimTrailingSlash","pathname","TRANSFER_PATH","reportInfo","connectToWebsocket","undefined","type","headers","Authorization","token","retryMessageOptions","createDispatcher","message","setTransferProperties","id","kind","dispatchTransferAction","close","Promise","resolve","CLOSED","on","getMetadata","beforeTransfer","rollback","getSchemas","createEntitiesWriteStream","writeStream","createLinksWriteStream","createConfigurationWriteStream","createAssetsWriteStream","batch","hasStarted","batchSize","batchLength","reduce","acc","chunk","action","data","startAssetsTransferOnce","startStepOnce","flush","streamError","streamStep","safePush","push","Writable","objectMode","final","callback","length","error","endStepError","endStep","write","asset","_encoding","startError","assetID","randomUUID","filename","filepath","stream","metadata","Error","constructor","name","stage","once","startStep","step","dispatchTransferStep","e","assetMessage","filter","startTransferOnce","started","finished","report","createdAt","Date","origin","createRemoteStrapiDestinationProvider"],"mappings":"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"}