@strapi/data-transfer 5.58.0 → 5.60.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (26) hide show
  1. package/dist/directory/providers/destination/index.d.ts.map +1 -1
  2. package/dist/directory/providers/destination/index.js.map +1 -1
  3. package/dist/directory/providers/destination/index.mjs.map +1 -1
  4. package/dist/engine/index.d.ts.map +1 -1
  5. package/dist/engine/index.js.map +1 -1
  6. package/dist/engine/index.mjs.map +1 -1
  7. package/dist/file/providers/destination/index.d.ts.map +1 -1
  8. package/dist/file/providers/destination/index.js.map +1 -1
  9. package/dist/file/providers/destination/index.mjs.map +1 -1
  10. package/dist/strapi/providers/remote-destination/index.d.ts.map +1 -1
  11. package/dist/strapi/providers/remote-destination/index.js.map +1 -1
  12. package/dist/strapi/providers/remote-destination/index.mjs.map +1 -1
  13. package/dist/strapi/providers/remote-source/index.d.ts.map +1 -1
  14. package/dist/strapi/providers/remote-source/index.js.map +1 -1
  15. package/dist/strapi/providers/remote-source/index.mjs.map +1 -1
  16. package/dist/strapi/remote/flows/index.d.ts.map +1 -1
  17. package/dist/strapi/remote/flows/index.js.map +1 -1
  18. package/dist/strapi/remote/flows/index.mjs.map +1 -1
  19. package/dist/strapi/remote/handlers/pull.d.ts.map +1 -1
  20. package/dist/strapi/remote/handlers/push.d.ts.map +1 -1
  21. package/dist/strapi/remote/handlers/utils.js +1 -1
  22. package/dist/strapi/remote/handlers/utils.js.map +1 -1
  23. package/dist/strapi/remote/handlers/utils.mjs +2 -2
  24. package/dist/strapi/remote/handlers/utils.mjs.map +1 -1
  25. package/dist/types/remote/protocol/client/transfer/index.d.ts.map +1 -1
  26. package/package.json +8 -8
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../../src/strapi/providers/remote-source/index.ts"],"sourcesContent":["import { createHash, type Hash } from 'crypto';\nimport { PassThrough, Readable, Writable } from 'stream';\nimport type { Struct, Utils } from '@strapi/types';\nimport { WebSocket } from 'ws';\n\nimport type {\n IAsset,\n IMetadata,\n ISourceProvider,\n ISourceProviderTransferResults,\n MaybePromise,\n Protocol,\n ProviderType,\n StageTotalsEstimate,\n TransferStage,\n} from '../../../types';\nimport type { IDiagnosticReporter } from '../../../utils/diagnostic';\nimport { Client, Server, Auth } from '../../../types/remote/protocol';\nimport { ProviderTransferError, ProviderValidationError } from '../../../errors/providers';\nimport { TRANSFER_PATH } from '../../remote/constants';\nimport { decodeTransferAssetStreamItem } from '../../../utils/transfer-asset-chunk';\nimport { write } from '../../../utils/writable-async-write';\nimport { ILocalStrapiSourceProviderOptions } from '../local-source';\nimport {\n createDispatcher,\n connectToWebsocket,\n trimTrailingSlash,\n type RetryMessageOptions,\n} from '../utils';\n\n/**\n * Pull server answers `assets` step `start` only after `estimateAssetTotals` (DB stream; remote sizes from DB when complete, else HTTP like `createAssetsStream`).\n * That can exceed the default dispatcher wait (~30s between resends, a few minutes total). This message\n * uses a longer window so large libraries do not fail with `Request timed out` before totals are returned.\n */\nconst ASSETS_START_RETRY_OVERRIDES: Partial<RetryMessageOptions> = {\n retryMessageTimeout: 120_000,\n retryMessageMaxRetries: 30,\n};\n\nexport interface IRemoteStrapiSourceProviderOptions extends ILocalStrapiSourceProviderOptions {\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 /** Max ms without forward progress on an asset (new remote chunk accepted or chunk fully handed to the asset stream). */\n streamTimeout?: number;\n /** Require per-asset checksum verification for transferred asset bytes. */\n verifyChecksums?: boolean;\n}\n\ntype QueueableAction = Protocol.Client.TransferAssetFlow &\n ({ action: 'stream' } | { action: 'end' });\n\nclass RemoteStrapiSourceProvider implements ISourceProvider {\n name = 'source::remote-strapi';\n\n type: ProviderType = 'source';\n\n options: IRemoteStrapiSourceProviderOptions;\n\n ws: WebSocket | null;\n\n dispatcher: ReturnType<typeof createDispatcher> | null;\n\n defaultOptions: Partial<IRemoteStrapiSourceProviderOptions> = {\n // Large files + JSON/WS backpressure can go minutes between *messages* while bytes still drain locally\n streamTimeout: 300_000,\n };\n\n constructor(options: IRemoteStrapiSourceProviderOptions) {\n this.options = {\n ...this.defaultOptions,\n ...options,\n };\n this.#checksumsEnabled = this.options.verifyChecksums === true;\n\n this.ws = null;\n this.dispatcher = null;\n }\n\n results?: ISourceProviderTransferResults | undefined;\n\n #diagnostics?: IDiagnosticReporter;\n\n #pullAssetStreamWireSampleLogged = false;\n\n #checksumsEnabled = false;\n\n /** Set from pull server `start` response for `assets` when present (for engine `getStageTotals`). */\n #cachedAssetsTotals?: StageTotalsEstimate;\n\n async #createStageReadStream(stage: Exclude<TransferStage, 'schemas'>) {\n if (stage === 'assets') {\n this.#cachedAssetsTotals = undefined;\n }\n\n const startResult = await this.#startStep(stage);\n\n if (startResult instanceof Error) {\n throw startResult;\n }\n\n const { id: processID, totals } = startResult as {\n id: string;\n totals?: StageTotalsEstimate;\n };\n\n if (stage === 'assets' && totals && (totals.totalBytes != null || totals.totalCount != null)) {\n this.#cachedAssetsTotals = totals;\n }\n\n // Default object-mode HWM (~16 chunks). Do not await `drain` on manual `push` while `pipe()`\n // is attached — drain/`readableLength` races reliably deadlock after a few 1MiB asset frames.\n // Backpressure for pull assets is enforced by the Writable below (`highWaterMark: 1`).\n const stream = new PassThrough({ objectMode: true });\n\n const listener = async (raw: Buffer) => {\n const parsed = JSON.parse(raw.toString());\n // If not a message related to our transfer process, ignore it\n if (!parsed.uuid || parsed?.data?.type !== 'transfer' || parsed?.data?.id !== processID) {\n this.ws?.once('message', listener);\n return;\n }\n\n const { uuid, data: message } = parsed;\n const { ended, error, data } = message;\n\n if (error) {\n await this.#respond(uuid);\n stream.destroy(error);\n return;\n }\n\n if (ended) {\n await this.#respond(uuid);\n await this.#endStep(stage);\n\n stream.end();\n return;\n }\n\n for (const item of Array.isArray(data) ? data : [data]) {\n stream.push(item as Parameters<PassThrough['push']>[0]);\n }\n\n this.ws?.once('message', listener);\n\n await this.#respond(uuid);\n };\n\n this.ws?.once('message', listener);\n\n return stream;\n }\n\n createEntitiesReadStream(): MaybePromise<Readable> {\n return this.#createStageReadStream('entities');\n }\n\n createLinksReadStream(): MaybePromise<Readable> {\n return this.#createStageReadStream('links');\n }\n\n async createAssetsReadStream(): Promise<Readable> {\n // Create the streams used to transfer the assets\n const stream = await this.#createStageReadStream('assets');\n const pass = new PassThrough({ objectMode: true });\n\n // Init the asset map\n const assets: {\n // TODO: could we include filename in this for improved logging?\n [assetID: string]: IAsset & {\n stream: PassThrough;\n queue: Array<QueueableAction>;\n status: 'ok' | 'closed' | 'errored';\n timeout?: NodeJS.Timeout;\n checksumHash?: Hash;\n };\n } = {};\n\n // Watch for stalled assets: no remote chunks and no completed writes to the asset stream for streamTimeout ms\n const resetTimeout = (assetID: string) => {\n if (!assets[assetID]) {\n return;\n }\n if (assets[assetID].timeout) {\n clearTimeout(assets[assetID].timeout);\n }\n assets[assetID].timeout = setTimeout(() => {\n if (!assets[assetID]) {\n return;\n }\n this.#reportInfo(`Asset ${assetID} transfer stalled, aborting.`);\n assets[assetID].status = 'errored';\n assets[assetID].stream.destroy(new Error(`Asset ${assetID} transfer timed out`));\n }, this.options.streamTimeout);\n };\n\n const clearStallTimeoutForAsset = (assetID: string) => {\n const entry = assets[assetID];\n if (entry?.timeout) {\n clearTimeout(entry.timeout);\n entry.timeout = undefined;\n }\n };\n\n const clearAllStallTimeouts = () => {\n for (const id of Object.keys(assets)) {\n clearStallTimeoutForAsset(id);\n }\n };\n\n /**\n * Serialize asset batch handling: `Readable.on('data', async …)` does not apply backpressure,\n * so we pipe through a Writable with highWaterMark 1 so only one batch is in flight.\n */\n const processAssetPayload = async (payload: Protocol.Client.TransferAssetFlow[]) => {\n for (const item of payload) {\n const { action, assetID } = item;\n\n if (action === 'start') {\n if (assets[assetID]) {\n throw new Error(`Asset ${assetID} already started`);\n }\n\n this.#reportInfo(`Asset ${assetID} starting`);\n assets[assetID] = {\n ...item.data,\n stream: new PassThrough(),\n status: 'ok',\n queue: [],\n ...(this.#checksumsEnabled ? { checksumHash: createHash('sha256') } : {}),\n };\n\n resetTimeout(assetID);\n\n await write(pass, assets[assetID]);\n } else if (action === 'stream' || action === 'end') {\n if (!assets[assetID]) {\n throw new Error(`No id matching ${assetID} for stream action`);\n }\n\n if (action === 'stream') {\n if (!this.#pullAssetStreamWireSampleLogged) {\n this.#pullAssetStreamWireSampleLogged = true;\n const { data } = item;\n // Same legacy shape `decodeTransferAssetStreamData` accepts after JSON.parse (proof, not frame-size guess).\n const legacyBufferJson =\n data &&\n typeof data === 'object' &&\n !Buffer.isBuffer(data) &&\n (data as { type?: string }).type === 'Buffer' &&\n (Array.isArray((data as { data?: unknown }).data) ||\n ArrayBuffer.isView((data as { data?: unknown }).data));\n if (legacyBufferJson) {\n this.#reportWarning(\n '[Data transfer][pull] Remote is using legacy Buffer JSON for asset chunks (each byte as a JSON number). That uses much more memory during JSON.parse than base64. Upgrade the remote Strapi to a version that sends base64 asset chunks, or out-of-memory errors may still happen on large files.'\n );\n }\n }\n resetTimeout(assetID);\n } else {\n clearTimeout(assets[assetID].timeout);\n }\n\n if (assets[assetID].status === 'closed') {\n throw new Error(`Asset ${assetID} is closed`);\n }\n\n assets[assetID].queue.push(item);\n }\n }\n\n for (const assetID in assets) {\n if (Object.prototype.hasOwnProperty.call(assets, assetID)) {\n const asset = assets[assetID];\n if (asset.queue?.length > 0) {\n await processQueue(assetID);\n }\n }\n }\n };\n\n const processor = new Writable({\n objectMode: true,\n highWaterMark: 1,\n write(payload: Protocol.Client.TransferAssetFlow[], _encoding, callback) {\n processAssetPayload(payload).then(\n () => {\n callback();\n },\n (err: Error) => {\n clearAllStallTimeouts();\n stream.destroy(err);\n callback(err);\n }\n );\n },\n final(callback) {\n pass.end();\n callback();\n },\n });\n\n processor.on('error', (err) => {\n clearAllStallTimeouts();\n pass.destroy(err);\n });\n\n stream.on('error', (err) => {\n clearAllStallTimeouts();\n processor.destroy(err);\n pass.destroy(err);\n });\n\n stream.once('end', () => {\n clearAllStallTimeouts();\n });\n\n stream.pipe(processor);\n\n /**\n * Start processing the queue for a given assetID\n *\n * Even though this is a loop that attempts to process the entire queue, it is safe to call this more than once\n * for the same asset id because the queue is shared globally, the items are shifted off, and immediately written\n */\n const processQueue = async (id: string) => {\n if (!assets[id]) {\n throw new Error(`Failed to write asset chunk for \"${id}\". Asset not found.`);\n }\n\n const asset = assets[id];\n const { status: currentStatus } = asset;\n\n if (['closed', 'errored'].includes(currentStatus)) {\n throw new Error(\n `Failed to write asset chunk for \"${id}\". The asset is currently \"${currentStatus}\"`\n );\n }\n\n while (asset.queue.length > 0) {\n const data = asset.queue.shift();\n\n if (!data) {\n throw new Error(`Invalid chunk found for ${id}`);\n }\n\n try {\n // if this is an end chunk, close the asset stream\n if (data.action === 'end') {\n this.#reportInfo(`Ending asset stream for ${id}`);\n await closeAssetStream(id, data.checksum);\n break; // Exit the loop after closing the stream\n }\n\n // Save the current chunk\n await writeChunkToStream(id, data);\n } catch (error) {\n if (!assets[id]) {\n throw new Error(`No id matching ${id} for writeAssetChunk`);\n }\n clearStallTimeoutForAsset(id);\n if (error instanceof Error) {\n throw error;\n }\n throw new Error(`Unexpected error while processing asset chunk for \"${id}\"`);\n }\n }\n };\n\n /**\n * Writes a chunk of data to the asset's stream.\n *\n * Only check if the targeted asset exists, no other validation is done.\n */\n const writeChunkToStream = async (id: string, item: QueueableAction) => {\n const asset = assets[id];\n\n if (!asset) {\n throw new Error(`Failed to write asset chunk for \"${id}\". Asset not found.`);\n }\n\n if (item.action !== 'stream') {\n throw new Error(`Expected stream queue item for \"${id}\"`);\n }\n const chunk = decodeTransferAssetStreamItem(item);\n asset.checksumHash?.update(chunk);\n\n await write(asset.stream, chunk);\n // Count slow draining as progress so backpressure on large chunks does not trip the stall timer\n resetTimeout(id);\n };\n\n /**\n * Closes the asset stream associated with the given ID.\n *\n * It deletes the stream for the asset upon successful closure.\n */\n const closeAssetStream = async (\n id: string,\n checksum?: { algorithm: 'sha256'; value: string }\n ) => {\n if (!assets[id]) {\n throw new Error(`Failed to close asset \"${id}\". Asset not found.`);\n }\n\n const asset = assets[id];\n // The queue processes stream chunks before `end`; the last `writeChunkToStream` calls\n // `resetTimeout` after the `end` chunk already cleared the timer — clear again before closing.\n clearStallTimeoutForAsset(id);\n\n if (this.#checksumsEnabled) {\n if (!checksum) {\n throw new ProviderTransferError(\n `Asset ${id} is missing checksum in transfer end payload`\n );\n }\n if (checksum.algorithm !== 'sha256') {\n throw new ProviderTransferError(\n `Asset ${id} checksum algorithm \"${checksum.algorithm}\" is not supported`\n );\n }\n const actual = asset.checksumHash?.digest('hex');\n if (!actual || actual !== checksum.value) {\n throw new ProviderTransferError(\n `Checksum mismatch for asset \"${id}\" (expected ${checksum.value}, got ${actual ?? 'none'})`\n );\n }\n }\n asset.status = 'closed';\n\n await new Promise<void>((resolve, reject) => {\n const { stream } = asset;\n\n stream\n .on('close', () => {\n delete assets[id];\n resolve();\n })\n .on('error', (e) => {\n delete assets[id];\n reject(new Error(`Failed to close asset \"${id}\". Asset stream error: ${e.toString()}`));\n })\n .end();\n });\n };\n\n return pass;\n }\n\n createConfigurationReadStream(): MaybePromise<Readable> {\n return this.#createStageReadStream('configuration');\n }\n\n async getMetadata(): Promise<IMetadata | null> {\n const metadata = await this.dispatcher?.dispatchTransferAction<IMetadata>('getMetadata');\n\n return metadata ?? null;\n }\n\n assertValidProtocol(url: URL) {\n const validProtocols = ['https:', 'http:'];\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 }\n\n async initTransfer(): Promise<string> {\n const wantsChecksums = this.options.verifyChecksums === true;\n const query = this.dispatcher?.dispatchCommand({\n command: 'init',\n ...(wantsChecksums ? { params: { transfer: 'pull', checksums: true } } : {}),\n });\n\n const res = (await query) as\n | (Server.Payload<Server.InitMessage> & { checksums?: boolean })\n | null;\n\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][pull] Checksums were requested but the remote does not support checksum negotiation; continuing without checksum validation.'\n );\n }\n\n return res.transferID;\n }\n\n #reportInfo(message: string) {\n this.#diagnostics?.report({\n details: {\n createdAt: new Date(),\n message,\n origin: 'remote-source-provider',\n },\n kind: 'info',\n });\n }\n\n /** Reports a warning diagnostic (`kind: 'warning'`). Consumers (e.g. CLI) choose log levels and routing. */\n #reportWarning(message: string) {\n this.#diagnostics?.report({\n details: {\n createdAt: new Date(),\n message,\n origin: 'remote-source-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 let ws: WebSocket;\n this.assertValidProtocol(url);\n const wsProtocol = url.protocol === 'https:' ? 'wss:' : 'ws:';\n const wsUrl = `${wsProtocol}//${url.host}${trimTrailingSlash(\n url.pathname\n )}${TRANSFER_PATH}/pull`;\n\n this.#pullAssetStreamWireSampleLogged = false;\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 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 const transferID = await this.initTransfer();\n this.#reportInfo(`initialized transfer ${transferID}`);\n\n this.dispatcher.setTransferProperties({ id: transferID, kind: 'pull' });\n await this.dispatcher.dispatchTransferAction('bootstrap');\n }\n\n async close() {\n await this.dispatcher?.dispatchTransferAction('close');\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 async getSchemas() {\n const schemas =\n await this.dispatcher?.dispatchTransferAction<Utils.String.Dict<Struct.Schema>>('getSchemas');\n\n return schemas ?? null;\n }\n\n async getStageTotals(stage: TransferStage): Promise<StageTotalsEstimate | null> {\n if (stage !== 'assets') {\n return null;\n }\n const cached = this.#cachedAssetsTotals;\n return cached ?? null;\n }\n\n async #startStep<T extends Client.TransferPullStep>(step: T) {\n try {\n return await this.dispatcher?.dispatchTransferStep(\n { action: 'start', step },\n step === 'assets' ? { retryOverrides: ASSETS_START_RETRY_OVERRIDES } : undefined\n );\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\n async #respond(uuid: string) {\n return new Promise((resolve, reject) => {\n this.ws?.send(JSON.stringify({ uuid }), (e) => {\n if (e) {\n reject(e);\n } else {\n resolve(e);\n }\n });\n });\n }\n\n async #endStep<T extends Client.TransferPullStep>(step: T) {\n try {\n await this.dispatcher?.dispatchTransferStep({ action: 'end', 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 return null;\n }\n}\n\nexport const createRemoteStrapiSourceProvider = (options: IRemoteStrapiSourceProviderOptions) => {\n return new RemoteStrapiSourceProvider(options);\n};\n"],"names":["ASSETS_START_RETRY_OVERRIDES","retryMessageTimeout","retryMessageMaxRetries","RemoteStrapiSourceProvider","createEntitiesReadStream","createLinksReadStream","createAssetsReadStream","stream","pass","PassThrough","objectMode","assets","resetTimeout","assetID","timeout","clearTimeout","setTimeout","status","destroy","Error","options","streamTimeout","clearStallTimeoutForAsset","entry","undefined","clearAllStallTimeouts","id","Object","keys","processAssetPayload","payload","item","action","data","queue","checksumHash","createHash","write","legacyBufferJson","Buffer","isBuffer","type","Array","isArray","ArrayBuffer","isView","push","prototype","hasOwnProperty","call","asset","length","processQueue","processor","Writable","highWaterMark","_encoding","callback","then","err","final","end","on","once","pipe","currentStatus","includes","shift","closeAssetStream","checksum","writeChunkToStream","error","chunk","decodeTransferAssetStreamItem","update","ProviderTransferError","algorithm","actual","digest","value","Promise","resolve","reject","e","toString","createConfigurationReadStream","getMetadata","metadata","dispatcher","dispatchTransferAction","assertValidProtocol","url","validProtocols","protocol","ProviderValidationError","check","details","initTransfer","wantsChecksums","verifyChecksums","query","dispatchCommand","command","params","transfer","checksums","res","transferID","bootstrap","diagnostics","auth","ws","wsProtocol","wsUrl","host","trimTrailingSlash","pathname","TRANSFER_PATH","connectToWebsocket","headers","Authorization","token","retryMessageOptions","createDispatcher","message","setTransferProperties","kind","close","CLOSED","getSchemas","schemas","getStageTotals","stage","cached","name","defaultOptions","startResult","processID","totals","totalBytes","totalCount","listener","raw","parsed","JSON","parse","uuid","ended","report","createdAt","Date","origin","step","dispatchTransferStep","retryOverrides","send","stringify","createRemoteStrapiSourceProvider"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../../src/strapi/providers/remote-source/index.ts"],"sourcesContent":["import { createHash, type Hash } from 'crypto';\nimport { PassThrough, Readable, Writable } from 'stream';\nimport type { Struct, Utils } from '@strapi/types';\nimport { WebSocket } from 'ws';\n\nimport type {\n IAsset,\n IMetadata,\n ISourceProvider,\n ISourceProviderTransferResults,\n MaybePromise,\n Protocol,\n ProviderType,\n StageTotalsEstimate,\n TransferStage,\n} from '../../../types';\nimport type { IDiagnosticReporter } from '../../../utils/diagnostic';\nimport { Client, Server, Auth } from '../../../types/remote/protocol';\nimport { ProviderTransferError, ProviderValidationError } from '../../../errors/providers';\nimport { TRANSFER_PATH } from '../../remote/constants';\nimport { decodeTransferAssetStreamItem } from '../../../utils/transfer-asset-chunk';\nimport { write } from '../../../utils/writable-async-write';\nimport { ILocalStrapiSourceProviderOptions } from '../local-source';\nimport {\n createDispatcher,\n connectToWebsocket,\n trimTrailingSlash,\n type RetryMessageOptions,\n} from '../utils';\n\n/**\n * Pull server answers `assets` step `start` only after `estimateAssetTotals` (DB stream; remote sizes from DB when complete, else HTTP like `createAssetsStream`).\n * That can exceed the default dispatcher wait (~30s between resends, a few minutes total). This message\n * uses a longer window so large libraries do not fail with `Request timed out` before totals are returned.\n */\nconst ASSETS_START_RETRY_OVERRIDES: Partial<RetryMessageOptions> = {\n retryMessageTimeout: 120_000,\n retryMessageMaxRetries: 30,\n};\n\nexport interface IRemoteStrapiSourceProviderOptions extends ILocalStrapiSourceProviderOptions {\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 /** Max ms without forward progress on an asset (new remote chunk accepted or chunk fully handed to the asset stream). */\n streamTimeout?: number;\n /** Require per-asset checksum verification for transferred asset bytes. */\n verifyChecksums?: boolean;\n}\n\ntype QueueableAction = Protocol.Client.TransferAssetFlow &\n ({ action: 'stream' } | { action: 'end' });\n\nclass RemoteStrapiSourceProvider implements ISourceProvider {\n name = 'source::remote-strapi';\n\n type: ProviderType = 'source';\n\n options: IRemoteStrapiSourceProviderOptions;\n\n ws: WebSocket | null;\n\n dispatcher: ReturnType<typeof createDispatcher> | null;\n\n defaultOptions: Partial<IRemoteStrapiSourceProviderOptions> = {\n // Large files + JSON/WS backpressure can go minutes between *messages* while bytes still drain locally\n streamTimeout: 300_000,\n };\n\n constructor(options: IRemoteStrapiSourceProviderOptions) {\n this.options = {\n ...this.defaultOptions,\n ...options,\n };\n this.#checksumsEnabled = this.options.verifyChecksums === true;\n\n this.ws = null;\n this.dispatcher = null;\n }\n\n results?: ISourceProviderTransferResults | undefined;\n\n #diagnostics?: IDiagnosticReporter;\n\n #pullAssetStreamWireSampleLogged = false;\n\n #checksumsEnabled = false;\n\n /** Set from pull server `start` response for `assets` when present (for engine `getStageTotals`). */\n #cachedAssetsTotals?: StageTotalsEstimate;\n\n async #createStageReadStream(stage: Exclude<TransferStage, 'schemas'>) {\n if (stage === 'assets') {\n this.#cachedAssetsTotals = undefined;\n }\n\n const startResult = await this.#startStep(stage);\n\n if (startResult instanceof Error) {\n throw startResult;\n }\n\n const { id: processID, totals } = startResult as {\n id: string;\n totals?: StageTotalsEstimate;\n };\n\n if (stage === 'assets' && totals && (totals.totalBytes != null || totals.totalCount != null)) {\n this.#cachedAssetsTotals = totals;\n }\n\n // Default object-mode HWM (~16 chunks). Do not await `drain` on manual `push` while `pipe()`\n // is attached — drain/`readableLength` races reliably deadlock after a few 1MiB asset frames.\n // Backpressure for pull assets is enforced by the Writable below (`highWaterMark: 1`).\n const stream = new PassThrough({ objectMode: true });\n\n const listener = async (raw: Buffer) => {\n const parsed = JSON.parse(raw.toString());\n // If not a message related to our transfer process, ignore it\n if (!parsed.uuid || parsed?.data?.type !== 'transfer' || parsed?.data?.id !== processID) {\n this.ws?.once('message', listener);\n return;\n }\n\n const { uuid, data: message } = parsed;\n const { ended, error, data } = message;\n\n if (error) {\n await this.#respond(uuid);\n stream.destroy(error);\n return;\n }\n\n if (ended) {\n await this.#respond(uuid);\n await this.#endStep(stage);\n\n stream.end();\n return;\n }\n\n for (const item of Array.isArray(data) ? data : [data]) {\n stream.push(item as Parameters<PassThrough['push']>[0]);\n }\n\n this.ws?.once('message', listener);\n\n await this.#respond(uuid);\n };\n\n this.ws?.once('message', listener);\n\n return stream;\n }\n\n createEntitiesReadStream(): MaybePromise<Readable> {\n return this.#createStageReadStream('entities');\n }\n\n createLinksReadStream(): MaybePromise<Readable> {\n return this.#createStageReadStream('links');\n }\n\n async createAssetsReadStream(): Promise<Readable> {\n // Create the streams used to transfer the assets\n const stream = await this.#createStageReadStream('assets');\n const pass = new PassThrough({ objectMode: true });\n\n // Init the asset map\n const assets: {\n // TODO: could we include filename in this for improved logging?\n [assetID: string]: IAsset & {\n stream: PassThrough;\n queue: Array<QueueableAction>;\n status: 'ok' | 'closed' | 'errored';\n timeout?: NodeJS.Timeout;\n checksumHash?: Hash;\n };\n } = {};\n\n // Watch for stalled assets: no remote chunks and no completed writes to the asset stream for streamTimeout ms\n const resetTimeout = (assetID: string) => {\n if (!assets[assetID]) {\n return;\n }\n if (assets[assetID].timeout) {\n clearTimeout(assets[assetID].timeout);\n }\n assets[assetID].timeout = setTimeout(() => {\n if (!assets[assetID]) {\n return;\n }\n this.#reportInfo(`Asset ${assetID} transfer stalled, aborting.`);\n assets[assetID].status = 'errored';\n assets[assetID].stream.destroy(new Error(`Asset ${assetID} transfer timed out`));\n }, this.options.streamTimeout);\n };\n\n const clearStallTimeoutForAsset = (assetID: string) => {\n const entry = assets[assetID];\n if (entry?.timeout) {\n clearTimeout(entry.timeout);\n entry.timeout = undefined;\n }\n };\n\n const clearAllStallTimeouts = () => {\n for (const id of Object.keys(assets)) {\n clearStallTimeoutForAsset(id);\n }\n };\n\n /**\n * Serialize asset batch handling: `Readable.on('data', async …)` does not apply backpressure,\n * so we pipe through a Writable with highWaterMark 1 so only one batch is in flight.\n */\n const processAssetPayload = async (payload: Protocol.Client.TransferAssetFlow[]) => {\n for (const item of payload) {\n const { action, assetID } = item;\n\n if (action === 'start') {\n if (assets[assetID]) {\n throw new Error(`Asset ${assetID} already started`);\n }\n\n this.#reportInfo(`Asset ${assetID} starting`);\n assets[assetID] = {\n ...item.data,\n stream: new PassThrough(),\n status: 'ok',\n queue: [],\n ...(this.#checksumsEnabled ? { checksumHash: createHash('sha256') } : {}),\n };\n\n resetTimeout(assetID);\n\n await write(pass, assets[assetID]);\n } else if (action === 'stream' || action === 'end') {\n if (!assets[assetID]) {\n throw new Error(`No id matching ${assetID} for stream action`);\n }\n\n if (action === 'stream') {\n if (!this.#pullAssetStreamWireSampleLogged) {\n this.#pullAssetStreamWireSampleLogged = true;\n const { data } = item;\n // Same legacy shape `decodeTransferAssetStreamData` accepts after JSON.parse (proof, not frame-size guess).\n const legacyBufferJson =\n data &&\n typeof data === 'object' &&\n !Buffer.isBuffer(data) &&\n (data as { type?: string }).type === 'Buffer' &&\n (Array.isArray((data as { data?: unknown }).data) ||\n ArrayBuffer.isView((data as { data?: unknown }).data));\n if (legacyBufferJson) {\n this.#reportWarning(\n '[Data transfer][pull] Remote is using legacy Buffer JSON for asset chunks (each byte as a JSON number). That uses much more memory during JSON.parse than base64. Upgrade the remote Strapi to a version that sends base64 asset chunks, or out-of-memory errors may still happen on large files.'\n );\n }\n }\n resetTimeout(assetID);\n } else {\n clearTimeout(assets[assetID].timeout);\n }\n\n if (assets[assetID].status === 'closed') {\n throw new Error(`Asset ${assetID} is closed`);\n }\n\n assets[assetID].queue.push(item);\n }\n }\n\n for (const assetID in assets) {\n if (Object.prototype.hasOwnProperty.call(assets, assetID)) {\n const asset = assets[assetID];\n if (asset.queue?.length > 0) {\n await processQueue(assetID);\n }\n }\n }\n };\n\n const processor = new Writable({\n objectMode: true,\n highWaterMark: 1,\n write(payload: Protocol.Client.TransferAssetFlow[], _encoding, callback) {\n processAssetPayload(payload).then(\n () => {\n callback();\n },\n (err: Error) => {\n clearAllStallTimeouts();\n stream.destroy(err);\n callback(err);\n }\n );\n },\n final(callback) {\n pass.end();\n callback();\n },\n });\n\n processor.on('error', (err) => {\n clearAllStallTimeouts();\n pass.destroy(err);\n });\n\n stream.on('error', (err) => {\n clearAllStallTimeouts();\n processor.destroy(err);\n pass.destroy(err);\n });\n\n stream.once('end', () => {\n clearAllStallTimeouts();\n });\n\n stream.pipe(processor);\n\n /**\n * Start processing the queue for a given assetID\n *\n * Even though this is a loop that attempts to process the entire queue, it is safe to call this more than once\n * for the same asset id because the queue is shared globally, the items are shifted off, and immediately written\n */\n const processQueue = async (id: string) => {\n if (!assets[id]) {\n throw new Error(`Failed to write asset chunk for \"${id}\". Asset not found.`);\n }\n\n const asset = assets[id];\n const { status: currentStatus } = asset;\n\n if (['closed', 'errored'].includes(currentStatus)) {\n throw new Error(\n `Failed to write asset chunk for \"${id}\". The asset is currently \"${currentStatus}\"`\n );\n }\n\n while (asset.queue.length > 0) {\n const data = asset.queue.shift();\n\n if (!data) {\n throw new Error(`Invalid chunk found for ${id}`);\n }\n\n try {\n // if this is an end chunk, close the asset stream\n if (data.action === 'end') {\n this.#reportInfo(`Ending asset stream for ${id}`);\n await closeAssetStream(id, data.checksum);\n break; // Exit the loop after closing the stream\n }\n\n // Save the current chunk\n await writeChunkToStream(id, data);\n } catch (error) {\n if (!assets[id]) {\n throw new Error(`No id matching ${id} for writeAssetChunk`);\n }\n clearStallTimeoutForAsset(id);\n if (error instanceof Error) {\n throw error;\n }\n throw new Error(`Unexpected error while processing asset chunk for \"${id}\"`);\n }\n }\n };\n\n /**\n * Writes a chunk of data to the asset's stream.\n *\n * Only check if the targeted asset exists, no other validation is done.\n */\n const writeChunkToStream = async (id: string, item: QueueableAction) => {\n const asset = assets[id];\n\n if (!asset) {\n throw new Error(`Failed to write asset chunk for \"${id}\". Asset not found.`);\n }\n\n if (item.action !== 'stream') {\n throw new Error(`Expected stream queue item for \"${id}\"`);\n }\n const chunk = decodeTransferAssetStreamItem(item);\n asset.checksumHash?.update(chunk);\n\n await write(asset.stream, chunk);\n // Count slow draining as progress so backpressure on large chunks does not trip the stall timer\n resetTimeout(id);\n };\n\n /**\n * Closes the asset stream associated with the given ID.\n *\n * It deletes the stream for the asset upon successful closure.\n */\n const closeAssetStream = async (\n id: string,\n checksum?: { algorithm: 'sha256'; value: string }\n ) => {\n if (!assets[id]) {\n throw new Error(`Failed to close asset \"${id}\". Asset not found.`);\n }\n\n const asset = assets[id];\n // The queue processes stream chunks before `end`; the last `writeChunkToStream` calls\n // `resetTimeout` after the `end` chunk already cleared the timer — clear again before closing.\n clearStallTimeoutForAsset(id);\n\n if (this.#checksumsEnabled) {\n if (!checksum) {\n throw new ProviderTransferError(\n `Asset ${id} is missing checksum in transfer end payload`\n );\n }\n if (checksum.algorithm !== 'sha256') {\n throw new ProviderTransferError(\n `Asset ${id} checksum algorithm \"${checksum.algorithm}\" is not supported`\n );\n }\n const actual = asset.checksumHash?.digest('hex');\n if (!actual || actual !== checksum.value) {\n throw new ProviderTransferError(\n `Checksum mismatch for asset \"${id}\" (expected ${checksum.value}, got ${actual ?? 'none'})`\n );\n }\n }\n asset.status = 'closed';\n\n await new Promise<void>((resolve, reject) => {\n const { stream } = asset;\n\n stream\n .on('close', () => {\n delete assets[id];\n resolve();\n })\n .on('error', (e) => {\n delete assets[id];\n reject(new Error(`Failed to close asset \"${id}\". Asset stream error: ${e.toString()}`));\n })\n .end();\n });\n };\n\n return pass;\n }\n\n createConfigurationReadStream(): MaybePromise<Readable> {\n return this.#createStageReadStream('configuration');\n }\n\n async getMetadata(): Promise<IMetadata | null> {\n const metadata = await this.dispatcher?.dispatchTransferAction<IMetadata>('getMetadata');\n\n return metadata ?? null;\n }\n\n assertValidProtocol(url: URL) {\n const validProtocols = ['https:', 'http:'];\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 }\n\n async initTransfer(): Promise<string> {\n const wantsChecksums = this.options.verifyChecksums === true;\n const query = this.dispatcher?.dispatchCommand({\n command: 'init',\n ...(wantsChecksums ? { params: { transfer: 'pull', checksums: true } } : {}),\n });\n\n const res = (await query) as\n (Server.Payload<Server.InitMessage> & { checksums?: boolean }) | null;\n\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][pull] Checksums were requested but the remote does not support checksum negotiation; continuing without checksum validation.'\n );\n }\n\n return res.transferID;\n }\n\n #reportInfo(message: string) {\n this.#diagnostics?.report({\n details: {\n createdAt: new Date(),\n message,\n origin: 'remote-source-provider',\n },\n kind: 'info',\n });\n }\n\n /** Reports a warning diagnostic (`kind: 'warning'`). Consumers (e.g. CLI) choose log levels and routing. */\n #reportWarning(message: string) {\n this.#diagnostics?.report({\n details: {\n createdAt: new Date(),\n message,\n origin: 'remote-source-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 let ws: WebSocket;\n this.assertValidProtocol(url);\n const wsProtocol = url.protocol === 'https:' ? 'wss:' : 'ws:';\n const wsUrl = `${wsProtocol}//${url.host}${trimTrailingSlash(\n url.pathname\n )}${TRANSFER_PATH}/pull`;\n\n this.#pullAssetStreamWireSampleLogged = false;\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 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 const transferID = await this.initTransfer();\n this.#reportInfo(`initialized transfer ${transferID}`);\n\n this.dispatcher.setTransferProperties({ id: transferID, kind: 'pull' });\n await this.dispatcher.dispatchTransferAction('bootstrap');\n }\n\n async close() {\n await this.dispatcher?.dispatchTransferAction('close');\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 async getSchemas() {\n const schemas =\n await this.dispatcher?.dispatchTransferAction<Utils.String.Dict<Struct.Schema>>('getSchemas');\n\n return schemas ?? null;\n }\n\n async getStageTotals(stage: TransferStage): Promise<StageTotalsEstimate | null> {\n if (stage !== 'assets') {\n return null;\n }\n const cached = this.#cachedAssetsTotals;\n return cached ?? null;\n }\n\n async #startStep<T extends Client.TransferPullStep>(step: T) {\n try {\n return await this.dispatcher?.dispatchTransferStep(\n { action: 'start', step },\n step === 'assets' ? { retryOverrides: ASSETS_START_RETRY_OVERRIDES } : undefined\n );\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\n async #respond(uuid: string) {\n return new Promise((resolve, reject) => {\n this.ws?.send(JSON.stringify({ uuid }), (e) => {\n if (e) {\n reject(e);\n } else {\n resolve(e);\n }\n });\n });\n }\n\n async #endStep<T extends Client.TransferPullStep>(step: T) {\n try {\n await this.dispatcher?.dispatchTransferStep({ action: 'end', 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 return null;\n }\n}\n\nexport const createRemoteStrapiSourceProvider = (options: IRemoteStrapiSourceProviderOptions) => {\n return new RemoteStrapiSourceProvider(options);\n};\n"],"names":["ASSETS_START_RETRY_OVERRIDES","retryMessageTimeout","retryMessageMaxRetries","RemoteStrapiSourceProvider","createEntitiesReadStream","createLinksReadStream","createAssetsReadStream","stream","pass","PassThrough","objectMode","assets","resetTimeout","assetID","timeout","clearTimeout","setTimeout","status","destroy","Error","options","streamTimeout","clearStallTimeoutForAsset","entry","undefined","clearAllStallTimeouts","id","Object","keys","processAssetPayload","payload","item","action","data","queue","checksumHash","createHash","write","legacyBufferJson","Buffer","isBuffer","type","Array","isArray","ArrayBuffer","isView","push","prototype","hasOwnProperty","call","asset","length","processQueue","processor","Writable","highWaterMark","_encoding","callback","then","err","final","end","on","once","pipe","currentStatus","includes","shift","closeAssetStream","checksum","writeChunkToStream","error","chunk","decodeTransferAssetStreamItem","update","ProviderTransferError","algorithm","actual","digest","value","Promise","resolve","reject","e","toString","createConfigurationReadStream","getMetadata","metadata","dispatcher","dispatchTransferAction","assertValidProtocol","url","validProtocols","protocol","ProviderValidationError","check","details","initTransfer","wantsChecksums","verifyChecksums","query","dispatchCommand","command","params","transfer","checksums","res","transferID","bootstrap","diagnostics","auth","ws","wsProtocol","wsUrl","host","trimTrailingSlash","pathname","TRANSFER_PATH","connectToWebsocket","headers","Authorization","token","retryMessageOptions","createDispatcher","message","setTransferProperties","kind","close","CLOSED","getSchemas","schemas","getStageTotals","stage","cached","name","defaultOptions","startResult","processID","totals","totalBytes","totalCount","listener","raw","parsed","JSON","parse","uuid","ended","report","createdAt","Date","origin","step","dispatchTransferStep","retryOverrides","send","stringify","createRemoteStrapiSourceProvider"],"mappings":";;;;;;;;;;;;;;;;;;AA8BA;;;;AAIC,IACD,MAAMA,4BAAAA,GAA6D;IACjEC,mBAAAA,EAAqB,MAAA;IACrBC,sBAAAA,EAAwB;AAC1B,CAAA;IA+CE,YAAA,iBAAA,8BAAA,CAAA,cAAA,CAAA,EAEA,gCAAA,iBAAA,8BAAA,CAAA,kCAAA,CAAA,EAEA,iBAAA,iBAAA,8BAAA,CAAA,mBAAA,CAAA,wGAGA,mBAAA,iBAAA,8BAAA,CAAA,qBAAA,CAAA,EAEM,sBAAA,iBAAA,8BAAA,CAAA,wBAAA,CAAA,EAuZN,WAAA,iBAAA,8BAAA,CAAA,aAAA,CAAA,+GAYA,cAAA,iBAAA,8BAAA,CAAA,gBAAA,CAAA,EA6FM,UAAA,iBAAA,8BAAA,CAAA,YAAA,CAAA,EAmBA,QAAA,iBAAA,8BAAA,CAAA,UAAA,CAAA,EAYA,QAAA,iBAAA,8BAAA,CAAA,UAAA,CAAA;AArkBR,MAAMC,0BAAAA,CAAAA;IAsGJC,wBAAAA,GAAmD;AACjD,QAAA,OAAO,+BAAA,CAAA,IAAI,EAAC,sBAAA,CAAA,CAAA,sBAAA,CAAA,CAAuB,UAAA,CAAA;AACrC,IAAA;IAEAC,qBAAAA,GAAgD;AAC9C,QAAA,OAAO,+BAAA,CAAA,IAAI,EAAC,sBAAA,CAAA,CAAA,sBAAA,CAAA,CAAuB,OAAA,CAAA;AACrC,IAAA;AAEA,IAAA,MAAMC,sBAAAA,GAA4C;;AAEhD,QAAA,MAAMC,SAAS,MAAM,+BAAA,CAAA,IAAI,EAAC,wBAAA,sBAAA,CAAA,CAAuB,QAAA,CAAA;QACjD,MAAMC,IAAAA,GAAO,IAAIC,WAAAA,CAAY;YAAEC,UAAAA,EAAY;AAAK,SAAA,CAAA;;AAGhD,QAAA,MAAMC,SASF,EAAC;;AAGL,QAAA,MAAMC,eAAe,CAACC,OAAAA,GAAAA;AACpB,YAAA,IAAI,CAACF,MAAM,CAACE,OAAAA,CAAQ,EAAE;AACpB,gBAAA;AACF,YAAA;AACA,YAAA,IAAIF,MAAM,CAACE,OAAAA,CAAQ,CAACC,OAAO,EAAE;AAC3BC,gBAAAA,YAAAA,CAAaJ,MAAM,CAACE,OAAAA,CAAQ,CAACC,OAAO,CAAA;AACtC,YAAA;AACAH,YAAAA,MAAM,CAACE,OAAAA,CAAQ,CAACC,OAAO,GAAGE,UAAAA,CAAW,IAAA;AACnC,gBAAA,IAAI,CAACL,MAAM,CAACE,OAAAA,CAAQ,EAAE;AACpB,oBAAA;AACF,gBAAA;gBACA,+BAAA,CAAA,IAAI,EAAC,WAAA,CAAA,CAAA,WAAA,CAAA,CAAY,CAAC,MAAM,EAAEA,OAAAA,CAAQ,4BAA4B,CAAC,CAAA;AAC/DF,gBAAAA,MAAM,CAACE,OAAAA,CAAQ,CAACI,MAAM,GAAG,SAAA;AACzBN,gBAAAA,MAAM,CAACE,OAAAA,CAAQ,CAACN,MAAM,CAACW,OAAO,CAAC,IAAIC,KAAAA,CAAM,CAAC,MAAM,EAAEN,OAAAA,CAAQ,mBAAmB,CAAC,CAAA,CAAA;AAChF,YAAA,CAAA,EAAG,IAAI,CAACO,OAAO,CAACC,aAAa,CAAA;AAC/B,QAAA,CAAA;AAEA,QAAA,MAAMC,4BAA4B,CAACT,OAAAA,GAAAA;YACjC,MAAMU,KAAAA,GAAQZ,MAAM,CAACE,OAAAA,CAAQ;AAC7B,YAAA,IAAIU,OAAOT,OAAAA,EAAS;AAClBC,gBAAAA,YAAAA,CAAaQ,MAAMT,OAAO,CAAA;AAC1BS,gBAAAA,KAAAA,CAAMT,OAAO,GAAGU,SAAAA;AAClB,YAAA;AACF,QAAA,CAAA;AAEA,QAAA,MAAMC,qBAAAA,GAAwB,IAAA;AAC5B,YAAA,KAAK,MAAMC,EAAAA,IAAMC,MAAAA,CAAOC,IAAI,CAACjB,MAAAA,CAAAA,CAAS;gBACpCW,yBAAAA,CAA0BI,EAAAA,CAAAA;AAC5B,YAAA;AACF,QAAA,CAAA;AAEA;;;QAIA,MAAMG,sBAAsB,OAAOC,OAAAA,GAAAA;YACjC,KAAK,MAAMC,QAAQD,OAAAA,CAAS;AAC1B,gBAAA,MAAM,EAAEE,MAAM,EAAEnB,OAAO,EAAE,GAAGkB,IAAAA;AAE5B,gBAAA,IAAIC,WAAW,OAAA,EAAS;oBACtB,IAAIrB,MAAM,CAACE,OAAAA,CAAQ,EAAE;AACnB,wBAAA,MAAM,IAAIM,KAAAA,CAAM,CAAC,MAAM,EAAEN,OAAAA,CAAQ,gBAAgB,CAAC,CAAA;AACpD,oBAAA;oBAEA,+BAAA,CAAA,IAAI,EAAC,WAAA,CAAA,CAAA,WAAA,CAAA,CAAY,CAAC,MAAM,EAAEA,OAAAA,CAAQ,SAAS,CAAC,CAAA;oBAC5CF,MAAM,CAACE,QAAQ,GAAG;AAChB,wBAAA,GAAGkB,KAAKE,IAAI;AACZ1B,wBAAAA,MAAAA,EAAQ,IAAIE,WAAAA,EAAAA;wBACZQ,MAAAA,EAAQ,IAAA;AACRiB,wBAAAA,KAAAA,EAAO,EAAE;AACT,wBAAA,GAAI,+BAAA,CAAA,IAAI,EAAC,iBAAA,CAAA,CAAA,iBAAA,CAAA,GAAoB;AAAEC,4BAAAA,YAAAA,EAAcC,UAAAA,CAAW,QAAA;AAAU,yBAAA,GAAI;AACxE,qBAAA;oBAEAxB,YAAAA,CAAaC,OAAAA,CAAAA;AAEb,oBAAA,MAAMwB,KAAAA,CAAM7B,IAAAA,EAAMG,MAAM,CAACE,OAAAA,CAAQ,CAAA;AACnC,gBAAA,CAAA,MAAO,IAAImB,MAAAA,KAAW,QAAA,IAAYA,MAAAA,KAAW,KAAA,EAAO;AAClD,oBAAA,IAAI,CAACrB,MAAM,CAACE,OAAAA,CAAQ,EAAE;AACpB,wBAAA,MAAM,IAAIM,KAAAA,CAAM,CAAC,eAAe,EAAEN,OAAAA,CAAQ,kBAAkB,CAAC,CAAA;AAC/D,oBAAA;AAEA,oBAAA,IAAImB,WAAW,QAAA,EAAU;AACvB,wBAAA,IAAI,CAAC,+BAAA,CAAA,IAAI,EAAC,kCAAA,gCAAA,CAAA,EAAkC;4BAC1C,+BAAA,CAAA,IAAI,EAAC,gCAAA,CAAA,CAAA,gCAAA,CAAA,GAAmC,IAAA;4BACxC,MAAM,EAAEC,IAAI,EAAE,GAAGF,IAAAA;;AAEjB,4BAAA,MAAMO,gBAAAA,GACJL,IAAAA,IACA,OAAOA,IAAAA,KAAS,QAAA,IAChB,CAACM,MAAAA,CAAOC,QAAQ,CAACP,IAAAA,CAAAA,IACjB,IAACA,CAA2BQ,IAAI,KAAK,QAAA,KACpCC,KAAAA,CAAMC,OAAO,CAAEV,IAAAA,CAA4BA,IAAI,CAAA,IAC9CW,WAAAA,CAAYC,MAAM,CAAC,IAACZ,CAA4BA,IAAI,CAAA,CAAA;AACxD,4BAAA,IAAIK,gBAAAA,EAAkB;gCACpB,+BAAA,CAAA,IAAI,EAAC,cAAA,CAAA,CAAA,cAAA,CAAA,CACH,mSAAA,CAAA;AAEJ,4BAAA;AACF,wBAAA;wBACA1B,YAAAA,CAAaC,OAAAA,CAAAA;oBACf,CAAA,MAAO;AACLE,wBAAAA,YAAAA,CAAaJ,MAAM,CAACE,OAAAA,CAAQ,CAACC,OAAO,CAAA;AACtC,oBAAA;AAEA,oBAAA,IAAIH,MAAM,CAACE,OAAAA,CAAQ,CAACI,MAAM,KAAK,QAAA,EAAU;AACvC,wBAAA,MAAM,IAAIE,KAAAA,CAAM,CAAC,MAAM,EAAEN,OAAAA,CAAQ,UAAU,CAAC,CAAA;AAC9C,oBAAA;AAEAF,oBAAAA,MAAM,CAACE,OAAAA,CAAQ,CAACqB,KAAK,CAACY,IAAI,CAACf,IAAAA,CAAAA;AAC7B,gBAAA;AACF,YAAA;YAEA,IAAK,MAAMlB,WAAWF,MAAAA,CAAQ;gBAC5B,IAAIgB,MAAAA,CAAOoB,SAAS,CAACC,cAAc,CAACC,IAAI,CAACtC,QAAQE,OAAAA,CAAAA,EAAU;oBACzD,MAAMqC,KAAAA,GAAQvC,MAAM,CAACE,OAAAA,CAAQ;AAC7B,oBAAA,IAAIqC,KAAAA,CAAMhB,KAAK,EAAEiB,MAAAA,GAAS,CAAA,EAAG;AAC3B,wBAAA,MAAMC,YAAAA,CAAavC,OAAAA,CAAAA;AACrB,oBAAA;AACF,gBAAA;AACF,YAAA;AACF,QAAA,CAAA;QAEA,MAAMwC,SAAAA,GAAY,IAAIC,QAAAA,CAAS;YAC7B5C,UAAAA,EAAY,IAAA;YACZ6C,aAAAA,EAAe,CAAA;AACflB,YAAAA,KAAAA,CAAAA,CAAMP,OAA4C,EAAE0B,SAAS,EAAEC,QAAQ,EAAA;gBACrE5B,mBAAAA,CAAoBC,OAAAA,CAAAA,CAAS4B,IAAI,CAC/B,IAAA;AACED,oBAAAA,QAAAA,EAAAA;AACF,gBAAA,CAAA,EACA,CAACE,GAAAA,GAAAA;AACClC,oBAAAA,qBAAAA,EAAAA;AACAlB,oBAAAA,MAAAA,CAAOW,OAAO,CAACyC,GAAAA,CAAAA;oBACfF,QAAAA,CAASE,GAAAA,CAAAA;AACX,gBAAA,CAAA,CAAA;AAEJ,YAAA,CAAA;AACAC,YAAAA,KAAAA,CAAAA,CAAMH,QAAQ,EAAA;AACZjD,gBAAAA,IAAAA,CAAKqD,GAAG,EAAA;AACRJ,gBAAAA,QAAAA,EAAAA;AACF,YAAA;AACF,SAAA,CAAA;QAEAJ,SAAAA,CAAUS,EAAE,CAAC,OAAA,EAAS,CAACH,GAAAA,GAAAA;AACrBlC,YAAAA,qBAAAA,EAAAA;AACAjB,YAAAA,IAAAA,CAAKU,OAAO,CAACyC,GAAAA,CAAAA;AACf,QAAA,CAAA,CAAA;QAEApD,MAAAA,CAAOuD,EAAE,CAAC,OAAA,EAAS,CAACH,GAAAA,GAAAA;AAClBlC,YAAAA,qBAAAA,EAAAA;AACA4B,YAAAA,SAAAA,CAAUnC,OAAO,CAACyC,GAAAA,CAAAA;AAClBnD,YAAAA,IAAAA,CAAKU,OAAO,CAACyC,GAAAA,CAAAA;AACf,QAAA,CAAA,CAAA;QAEApD,MAAAA,CAAOwD,IAAI,CAAC,KAAA,EAAO,IAAA;AACjBtC,YAAAA,qBAAAA,EAAAA;AACF,QAAA,CAAA,CAAA;AAEAlB,QAAAA,MAAAA,CAAOyD,IAAI,CAACX,SAAAA,CAAAA;AAEZ;;;;;QAMA,MAAMD,eAAe,OAAO1B,EAAAA,GAAAA;AAC1B,YAAA,IAAI,CAACf,MAAM,CAACe,EAAAA,CAAG,EAAE;AACf,gBAAA,MAAM,IAAIP,KAAAA,CAAM,CAAC,iCAAiC,EAAEO,EAAAA,CAAG,mBAAmB,CAAC,CAAA;AAC7E,YAAA;YAEA,MAAMwB,KAAAA,GAAQvC,MAAM,CAACe,EAAAA,CAAG;AACxB,YAAA,MAAM,EAAET,MAAAA,EAAQgD,aAAa,EAAE,GAAGf,KAAAA;YAElC,IAAI;AAAC,gBAAA,QAAA;AAAU,gBAAA;aAAU,CAACgB,QAAQ,CAACD,aAAAA,CAAAA,EAAgB;gBACjD,MAAM,IAAI9C,KAAAA,CACR,CAAC,iCAAiC,EAAEO,GAAG,2BAA2B,EAAEuC,aAAAA,CAAc,CAAC,CAAC,CAAA;AAExF,YAAA;AAEA,YAAA,MAAOf,KAAAA,CAAMhB,KAAK,CAACiB,MAAM,GAAG,CAAA,CAAG;AAC7B,gBAAA,MAAMlB,IAAAA,GAAOiB,KAAAA,CAAMhB,KAAK,CAACiC,KAAK,EAAA;AAE9B,gBAAA,IAAI,CAAClC,IAAAA,EAAM;AACT,oBAAA,MAAM,IAAId,KAAAA,CAAM,CAAC,wBAAwB,EAAEO,EAAAA,CAAAA,CAAI,CAAA;AACjD,gBAAA;gBAEA,IAAI;;oBAEF,IAAIO,IAAAA,CAAKD,MAAM,KAAK,KAAA,EAAO;AACzB,wBAAA,+BAAA,CAAA,IAAI,EAAC,WAAA,CAAA,CAAA,aAAY,CAAC,wBAAwB,EAAEN,EAAAA,CAAAA,CAAI,CAAA;wBAChD,MAAM0C,gBAAAA,CAAiB1C,EAAAA,EAAIO,IAAAA,CAAKoC,QAAQ,CAAA;AACxC,wBAAA,MAAA;AACF,oBAAA;;AAGA,oBAAA,MAAMC,mBAAmB5C,EAAAA,EAAIO,IAAAA,CAAAA;AAC/B,gBAAA,CAAA,CAAE,OAAOsC,KAAAA,EAAO;AACd,oBAAA,IAAI,CAAC5D,MAAM,CAACe,EAAAA,CAAG,EAAE;AACf,wBAAA,MAAM,IAAIP,KAAAA,CAAM,CAAC,eAAe,EAAEO,EAAAA,CAAG,oBAAoB,CAAC,CAAA;AAC5D,oBAAA;oBACAJ,yBAAAA,CAA0BI,EAAAA,CAAAA;AAC1B,oBAAA,IAAI6C,iBAAiBpD,KAAAA,EAAO;wBAC1B,MAAMoD,KAAAA;AACR,oBAAA;AACA,oBAAA,MAAM,IAAIpD,KAAAA,CAAM,CAAC,mDAAmD,EAAEO,EAAAA,CAAG,CAAC,CAAC,CAAA;AAC7E,gBAAA;AACF,YAAA;AACF,QAAA,CAAA;AAEA;;;;QAKA,MAAM4C,kBAAAA,GAAqB,OAAO5C,EAAAA,EAAYK,IAAAA,GAAAA;YAC5C,MAAMmB,KAAAA,GAAQvC,MAAM,CAACe,EAAAA,CAAG;AAExB,YAAA,IAAI,CAACwB,KAAAA,EAAO;AACV,gBAAA,MAAM,IAAI/B,KAAAA,CAAM,CAAC,iCAAiC,EAAEO,EAAAA,CAAG,mBAAmB,CAAC,CAAA;AAC7E,YAAA;YAEA,IAAIK,IAAAA,CAAKC,MAAM,KAAK,QAAA,EAAU;AAC5B,gBAAA,MAAM,IAAIb,KAAAA,CAAM,CAAC,gCAAgC,EAAEO,EAAAA,CAAG,CAAC,CAAC,CAAA;AAC1D,YAAA;AACA,YAAA,MAAM8C,QAAQC,6BAAAA,CAA8B1C,IAAAA,CAAAA;YAC5CmB,KAAAA,CAAMf,YAAY,EAAEuC,MAAAA,CAAOF,KAAAA,CAAAA;YAE3B,MAAMnC,KAAAA,CAAMa,KAAAA,CAAM3C,MAAM,EAAEiE,KAAAA,CAAAA;;YAE1B5D,YAAAA,CAAac,EAAAA,CAAAA;AACf,QAAA,CAAA;AAEA;;;;QAKA,MAAM0C,gBAAAA,GAAmB,OACvB1C,EAAAA,EACA2C,QAAAA,GAAAA;AAEA,YAAA,IAAI,CAAC1D,MAAM,CAACe,EAAAA,CAAG,EAAE;AACf,gBAAA,MAAM,IAAIP,KAAAA,CAAM,CAAC,uBAAuB,EAAEO,EAAAA,CAAG,mBAAmB,CAAC,CAAA;AACnE,YAAA;YAEA,MAAMwB,KAAAA,GAAQvC,MAAM,CAACe,EAAAA,CAAG;;;YAGxBJ,yBAAAA,CAA0BI,EAAAA,CAAAA;AAE1B,YAAA,IAAI,+BAAA,CAAA,IAAI,EAAC,iBAAA,CAAA,CAAA,iBAAA,CAAA,EAAmB;AAC1B,gBAAA,IAAI,CAAC2C,QAAAA,EAAU;AACb,oBAAA,MAAM,IAAIM,qBAAAA,CACR,CAAC,MAAM,EAAEjD,EAAAA,CAAG,4CAA4C,CAAC,CAAA;AAE7D,gBAAA;gBACA,IAAI2C,QAAAA,CAASO,SAAS,KAAK,QAAA,EAAU;AACnC,oBAAA,MAAM,IAAID,qBAAAA,CACR,CAAC,MAAM,EAAEjD,EAAAA,CAAG,qBAAqB,EAAE2C,QAAAA,CAASO,SAAS,CAAC,kBAAkB,CAAC,CAAA;AAE7E,gBAAA;AACA,gBAAA,MAAMC,MAAAA,GAAS3B,KAAAA,CAAMf,YAAY,EAAE2C,MAAAA,CAAO,KAAA,CAAA;AAC1C,gBAAA,IAAI,CAACD,MAAAA,IAAUA,MAAAA,KAAWR,QAAAA,CAASU,KAAK,EAAE;AACxC,oBAAA,MAAM,IAAIJ,qBAAAA,CACR,CAAC,6BAA6B,EAAEjD,GAAG,YAAY,EAAE2C,QAAAA,CAASU,KAAK,CAAC,MAAM,EAAEF,MAAAA,IAAU,MAAA,CAAO,CAAC,CAAC,CAAA;AAE/F,gBAAA;AACF,YAAA;AACA3B,YAAAA,KAAAA,CAAMjC,MAAM,GAAG,QAAA;YAEf,MAAM,IAAI+D,OAAAA,CAAc,CAACC,OAAAA,EAASC,MAAAA,GAAAA;gBAChC,MAAM,EAAE3E,MAAM,EAAE,GAAG2C,KAAAA;gBAEnB3C,MAAAA,CACGuD,EAAE,CAAC,OAAA,EAAS,IAAA;oBACX,OAAOnD,MAAM,CAACe,EAAAA,CAAG;AACjBuD,oBAAAA,OAAAA,EAAAA;gBACF,CAAA,CAAA,CACCnB,EAAE,CAAC,OAAA,EAAS,CAACqB,CAAAA,GAAAA;oBACZ,OAAOxE,MAAM,CAACe,EAAAA,CAAG;oBACjBwD,MAAAA,CAAO,IAAI/D,KAAAA,CAAM,CAAC,uBAAuB,EAAEO,GAAG,uBAAuB,EAAEyD,CAAAA,CAAEC,QAAQ,EAAA,CAAA,CAAI,CAAA,CAAA;AACvF,gBAAA,CAAA,CAAA,CACCvB,GAAG,EAAA;AACR,YAAA,CAAA,CAAA;AACF,QAAA,CAAA;QAEA,OAAOrD,IAAAA;AACT,IAAA;IAEA6E,6BAAAA,GAAwD;AACtD,QAAA,OAAO,+BAAA,CAAA,IAAI,EAAC,sBAAA,CAAA,CAAA,sBAAA,CAAA,CAAuB,eAAA,CAAA;AACrC,IAAA;AAEA,IAAA,MAAMC,WAAAA,GAAyC;AAC7C,QAAA,MAAMC,WAAW,MAAM,IAAI,CAACC,UAAU,EAAEC,sBAAAA,CAAkC,aAAA,CAAA;AAE1E,QAAA,OAAOF,QAAAA,IAAY,IAAA;AACrB,IAAA;AAEAG,IAAAA,mBAAAA,CAAoBC,GAAQ,EAAE;AAC5B,QAAA,MAAMC,cAAAA,GAAiB;AAAC,YAAA,QAAA;AAAU,YAAA;AAAQ,SAAA;AAE1C,QAAA,IAAI,CAACA,cAAAA,CAAe1B,QAAQ,CAACyB,GAAAA,CAAIE,QAAQ,CAAA,EAAG;YAC1C,MAAM,IAAIC,uBAAAA,CAAwB,CAAC,kBAAkB,EAAEH,IAAIE,QAAQ,CAAC,CAAC,CAAC,EAAE;gBACtEE,KAAAA,EAAO,KAAA;gBACPC,OAAAA,EAAS;AACPH,oBAAAA,QAAAA,EAAUF,IAAIE,QAAQ;AACtBD,oBAAAA;AACF;AACF,aAAA,CAAA;AACF,QAAA;AACF,IAAA;AAEA,IAAA,MAAMK,YAAAA,GAAgC;AACpC,QAAA,MAAMC,iBAAiB,IAAI,CAAC9E,OAAO,CAAC+E,eAAe,KAAK,IAAA;AACxD,QAAA,MAAMC,KAAAA,GAAQ,IAAI,CAACZ,UAAU,EAAEa,eAAAA,CAAgB;YAC7CC,OAAAA,EAAS,MAAA;AACT,YAAA,GAAIJ,cAAAA,GAAiB;gBAAEK,MAAAA,EAAQ;oBAAEC,QAAAA,EAAU,MAAA;oBAAQC,SAAAA,EAAW;AAAK;AAAE,aAAA,GAAI;AAC3E,SAAA,CAAA;AAEA,QAAA,MAAMC,MAAO,MAAMN,KAAAA;QAGnB,IAAI,CAACM,KAAKC,UAAAA,EAAY;AACpB,YAAA,MAAM,IAAIhC,qBAAAA,CAAsB,+CAAA,CAAA;AAClC,QAAA;AACA,QAAA,+BAAA,CAAA,IAAI,EAAC,iBAAA,CAAA,CAAA,qBAAoBuB,cAAAA,IAAkBQ,GAAAA,CAAID,SAAS,KAAK,IAAA;AAC7D,QAAA,IAAIP,cAAAA,IAAkBQ,GAAAA,CAAID,SAAS,KAAK,IAAA,EAAM;YAC5C,+BAAA,CAAA,IAAI,EAAC,cAAA,CAAA,CAAA,cAAA,CAAA,CACH,8IAAA,CAAA;AAEJ,QAAA;AAEA,QAAA,OAAOC,IAAIC,UAAU;AACvB,IAAA;IAyBA,MAAMC,SAAAA,CAAUC,WAAiC,EAAiB;QAChE,+BAAA,CAAA,IAAI,EAAC,YAAA,CAAA,CAAA,YAAA,CAAA,GAAeA,WAAAA;QACpB,MAAM,EAAElB,GAAG,EAAEmB,IAAI,EAAE,GAAG,IAAI,CAAC1F,OAAO;QAClC,IAAI2F,EAAAA;QACJ,IAAI,CAACrB,mBAAmB,CAACC,GAAAA,CAAAA;AACzB,QAAA,MAAMqB,UAAAA,GAAarB,GAAAA,CAAIE,QAAQ,KAAK,WAAW,MAAA,GAAS,KAAA;AACxD,QAAA,MAAMoB,KAAAA,GAAQ,CAAA,EAAGD,UAAAA,CAAW,EAAE,EAAErB,GAAAA,CAAIuB,IAAI,CAAA,EAAGC,iBAAAA,CACzCxB,GAAAA,CAAIyB,QAAQ,CAAA,CAAA,EACVC,aAAAA,CAAc,KAAK,CAAC;QAExB,+BAAA,CAAA,IAAI,EAAC,gCAAA,CAAA,CAAA,gCAAA,CAAA,GAAmC,KAAA;QAExC,+BAAA,CAAA,IAAI,EAAC,WAAA,CAAA,CAAA,WAAA,CAAA,CAAY,mCAAA,CAAA;;AAEjB,QAAA,IAAI,CAACP,IAAAA,EAAM;AACTC,YAAAA,EAAAA,GAAK,MAAMO,kBAAAA,CAAmBL,KAAAA,EAAOzF,WAAW,+BAAA,CAAA,IAAI,EAAC,YAAA,CAAA,CAAA,YAAA,CAAA,CAAA;AACvD,QAAA,CAAA,MAGK,IAAIsF,IAAAA,CAAKrE,IAAI,KAAK,OAAA,EAAS;AAC9B,YAAA,MAAM8E,OAAAA,GAAU;AAAEC,gBAAAA,aAAAA,EAAe,CAAC,OAAO,EAAEV,IAAAA,CAAKW,KAAK,CAAA;AAAG,aAAA;YACxDV,EAAAA,GAAK,MAAMO,mBAAmBL,KAAAA,EAAO;AAAEM,gBAAAA;aAAQ,EAAG,+BAAA,CAAA,IAAI,EAAC,YAAA,CAAA,CAAA,YAAA,CAAA,CAAA;QACzD,CAAA,MAGK;YACH,MAAM,IAAIzB,wBAAwB,2BAAA,EAA6B;gBAC7DC,KAAAA,EAAO,WAAA;gBACPC,OAAAA,EAAS;AACPc,oBAAAA,IAAAA,EAAMA,KAAKrE;AACb;AACF,aAAA,CAAA;AACF,QAAA;QAEA,+BAAA,CAAA,IAAI,EAAC,WAAA,CAAA,CAAA,WAAA,CAAA,CAAY,kCAAA,CAAA;QACjB,IAAI,CAACsE,EAAE,GAAGA,EAAAA;AACV,QAAA,MAAM,EAAEW,mBAAmB,EAAE,GAAG,IAAI,CAACtG,OAAO;QAE5C,+BAAA,CAAA,IAAI,EAAC,WAAA,CAAA,CAAA,WAAA,CAAA,CAAY,qBAAA,CAAA;AACjB,QAAA,IAAI,CAACoE,UAAU,GAAGmC,gBAAAA,CAAiB,IAAI,CAACZ,EAAE,EAAEW,mBAAAA,EAAqB,CAACE,OAAAA,GAChE,+BAAA,CAAA,IAAI,EAAC,aAAA,WAAA,CAAA,CAAYA,OAAAA,CAAAA,CAAAA;QAEnB,+BAAA,CAAA,IAAI,EAAC,WAAA,CAAA,CAAA,WAAA,CAAA,CAAY,oBAAA,CAAA;QAEjB,+BAAA,CAAA,IAAI,EAAC,WAAA,CAAA,CAAA,WAAA,CAAA,CAAY,qBAAA,CAAA;AACjB,QAAA,MAAMjB,UAAAA,GAAa,MAAM,IAAI,CAACV,YAAY,EAAA;AAC1C,QAAA,+BAAA,CAAA,IAAI,EAAC,WAAA,CAAA,CAAA,aAAY,CAAC,qBAAqB,EAAEU,UAAAA,CAAAA,CAAY,CAAA;AAErD,QAAA,IAAI,CAACnB,UAAU,CAACqC,qBAAqB,CAAC;YAAEnG,EAAAA,EAAIiF,UAAAA;YAAYmB,IAAAA,EAAM;AAAO,SAAA,CAAA;AACrE,QAAA,MAAM,IAAI,CAACtC,UAAU,CAACC,sBAAsB,CAAC,WAAA,CAAA;AAC/C,IAAA;AAEA,IAAA,MAAMsC,KAAAA,GAAQ;AACZ,QAAA,MAAM,IAAI,CAACvC,UAAU,EAAEC,sBAAAA,CAAuB,OAAA,CAAA;QAE9C,MAAM,IAAIT,QAAc,CAACC,OAAAA,GAAAA;AACvB,YAAA,MAAM,EAAE8B,EAAE,EAAE,GAAG,IAAI;AAEnB,YAAA,IAAI,CAACA,EAAAA,IAAMA,EAAAA,CAAGiB,MAAM,EAAE;AACpB/C,gBAAAA,OAAAA,EAAAA;AACA,gBAAA;AACF,YAAA;AAEA8B,YAAAA,EAAAA,CAAGjD,EAAE,CAAC,OAAA,EAAS,IAAMmB,WAAW8C,KAAK,EAAA;AACvC,QAAA,CAAA,CAAA;AACF,IAAA;AAEA,IAAA,MAAME,UAAAA,GAAa;AACjB,QAAA,MAAMC,UACJ,MAAM,IAAI,CAAC1C,UAAU,EAAEC,sBAAAA,CAAyD,YAAA,CAAA;AAElF,QAAA,OAAOyC,OAAAA,IAAW,IAAA;AACpB,IAAA;IAEA,MAAMC,cAAAA,CAAeC,KAAoB,EAAuC;AAC9E,QAAA,IAAIA,UAAU,QAAA,EAAU;YACtB,OAAO,IAAA;AACT,QAAA;AACA,QAAA,MAAMC,MAAAA,GAAS,+BAAA,CAAA,IAAI,EAAC,mBAAA,CAAA,CAAA,mBAAA,CAAA;AACpB,QAAA,OAAOA,MAAAA,IAAU,IAAA;AACnB,IAAA;AAphBA,IAAA,WAAA,CAAYjH,OAA2C,CAAE;QAsBzD,MAAA,CAAA,cAAA,CAAA,IAAA,EAAM,sBAAA,EAAA;AAAN,YAAA,KAAA,EAAA;;QAuZA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,WAAA,EAAA;AAAA,YAAA,KAAA,EAAA;;QAYA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,cAAA,EAAA;AAAA,YAAA,KAAA,EAAA;;QA6FA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAM,UAAA,EAAA;AAAN,YAAA,KAAA,EAAA;;QAmBA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAM,QAAA,EAAA;AAAN,YAAA,KAAA,EAAA;;QAYA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAM,QAAA,EAAA;AAAN,YAAA,KAAA,EAAA;;QAxiBA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,YAAA,EAAA;;mBAAA;;QAEA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,gCAAA,EAAA;;mBAAA;;QAEA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,iBAAA,EAAA;;mBAAA;;QAGA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,mBAAA,EAAA;;mBAAA;;aAnCAkH,IAAAA,GAAO,uBAAA;aAEP7F,IAAAA,GAAqB,QAAA;aAQrB8F,cAAAA,GAA8D;;YAE5DlH,aAAAA,EAAe;AACjB,SAAA;AAiBA,QAAA,+BAAA,CAAA,IAAA,EAAA,gCAAA,CAAA,CAAA,gCAAA,CAAA,GAAmC,KAAA;AAEnC,QAAA,+BAAA,CAAA,IAAA,EAAA,iBAAA,CAAA,CAAA,iBAAA,CAAA,GAAoB,KAAA;QAhBlB,IAAI,CAACD,OAAO,GAAG;YACb,GAAG,IAAI,CAACmH,cAAc;AACtB,YAAA,GAAGnH;AACL,SAAA;QACA,+BAAA,CAAA,IAAI,EAAC,iBAAA,CAAA,CAAA,iBAAA,CAAA,GAAoB,IAAI,CAACA,OAAO,CAAC+E,eAAe,KAAK,IAAA;QAE1D,IAAI,CAACY,EAAE,GAAG,IAAA;QACV,IAAI,CAACvB,UAAU,GAAG,IAAA;AACpB,IAAA;AA6jBF;AAhjBE,eAAA,sBAA6B4C,KAAwC,EAAA;AACnE,IAAA,IAAIA,UAAU,QAAA,EAAU;QACtB,+BAAA,CAAA,IAAI,EAAC,mBAAA,CAAA,CAAA,mBAAA,CAAA,GAAsB5G,SAAAA;AAC7B,IAAA;AAEA,IAAA,MAAMgH,cAAc,MAAM,+BAAA,CAAA,IAAI,EAAC,YAAA,UAAA,CAAA,CAAWJ,KAAAA,CAAAA;AAE1C,IAAA,IAAII,uBAAuBrH,KAAAA,EAAO;QAChC,MAAMqH,WAAAA;AACR,IAAA;AAEA,IAAA,MAAM,EAAE9G,EAAAA,EAAI+G,SAAS,EAAEC,MAAM,EAAE,GAAGF,WAAAA;AAKlC,IAAA,IAAIJ,KAAAA,KAAU,QAAA,IAAYM,MAAAA,KAAWA,MAAAA,CAAOC,UAAU,IAAI,IAAA,IAAQD,MAAAA,CAAOE,UAAU,IAAI,IAAG,CAAA,EAAI;QAC5F,+BAAA,CAAA,IAAI,EAAC,mBAAA,CAAA,CAAA,mBAAA,CAAA,GAAsBF,MAAAA;AAC7B,IAAA;;;;IAKA,MAAMnI,MAAAA,GAAS,IAAIE,WAAAA,CAAY;QAAEC,UAAAA,EAAY;AAAK,KAAA,CAAA;AAElD,IAAA,MAAMmI,WAAW,OAAOC,GAAAA,GAAAA;AACtB,QAAA,MAAMC,MAAAA,GAASC,IAAAA,CAAKC,KAAK,CAACH,IAAI1D,QAAQ,EAAA,CAAA;;QAEtC,IAAI,CAAC2D,MAAAA,CAAOG,IAAI,IAAIH,MAAAA,EAAQ9G,IAAAA,EAAMQ,IAAAA,KAAS,UAAA,IAAcsG,MAAAA,EAAQ9G,IAAAA,EAAMP,EAAAA,KAAO+G,SAAAA,EAAW;AACvF,YAAA,IAAI,CAAC1B,EAAE,EAAEhD,IAAAA,CAAK,SAAA,EAAW8E,QAAAA,CAAAA;AACzB,YAAA;AACF,QAAA;AAEA,QAAA,MAAM,EAAEK,IAAI,EAAEjH,IAAAA,EAAM2F,OAAO,EAAE,GAAGmB,MAAAA;AAChC,QAAA,MAAM,EAAEI,KAAK,EAAE5E,KAAK,EAAEtC,IAAI,EAAE,GAAG2F,OAAAA;AAE/B,QAAA,IAAIrD,KAAAA,EAAO;AACT,YAAA,MAAM,+BAAA,CAAA,IAAI,EAAC,QAAA,CAAA,CAAA,QAAA,CAAA,CAAS2E,IAAAA,CAAAA;AACpB3I,YAAAA,MAAAA,CAAOW,OAAO,CAACqD,KAAAA,CAAAA;AACf,YAAA;AACF,QAAA;AAEA,QAAA,IAAI4E,KAAAA,EAAO;AACT,YAAA,MAAM,+BAAA,CAAA,IAAI,EAAC,QAAA,CAAA,CAAA,QAAA,CAAA,CAASD,IAAAA,CAAAA;AACpB,YAAA,MAAM,+BAAA,CAAA,IAAI,EAAC,QAAA,CAAA,CAAA,QAAA,CAAA,CAASd,KAAAA,CAAAA;AAEpB7H,YAAAA,MAAAA,CAAOsD,GAAG,EAAA;AACV,YAAA;AACF,QAAA;AAEA,QAAA,KAAK,MAAM9B,IAAAA,IAAQW,KAAAA,CAAMC,OAAO,CAACV,QAAQA,IAAAA,GAAO;AAACA,YAAAA;SAAK,CAAE;AACtD1B,YAAAA,MAAAA,CAAOuC,IAAI,CAACf,IAAAA,CAAAA;AACd,QAAA;AAEA,QAAA,IAAI,CAACgF,EAAE,EAAEhD,IAAAA,CAAK,SAAA,EAAW8E,QAAAA,CAAAA;AAEzB,QAAA,MAAM,+BAAA,CAAA,IAAI,EAAC,QAAA,CAAA,CAAA,QAAA,CAAA,CAASK,IAAAA,CAAAA;AACtB,IAAA,CAAA;AAEA,IAAA,IAAI,CAACnC,EAAE,EAAEhD,IAAAA,CAAK,SAAA,EAAW8E,QAAAA,CAAAA;IAEzB,OAAOtI,MAAAA;AACT;AAyVA,SAAA,WAAYqH,OAAe,EAAA;AACzB,IAAA,+BAAA,CAAA,IAAI,EAAC,YAAA,CAAA,CAAA,YAAA,CAAA,EAAcwB,MAAAA,CAAO;QACxBpD,OAAAA,EAAS;AACPqD,YAAAA,SAAAA,EAAW,IAAIC,IAAAA,EAAAA;AACf1B,YAAAA,OAAAA;YACA2B,MAAAA,EAAQ;AACV,SAAA;QACAzB,IAAAA,EAAM;AACR,KAAA,CAAA;AACF;AAGA,SAAA,cAAeF,OAAe,EAAA;AAC5B,IAAA,+BAAA,CAAA,IAAI,EAAC,YAAA,CAAA,CAAA,YAAA,CAAA,EAAcwB,MAAAA,CAAO;QACxBpD,OAAAA,EAAS;AACPqD,YAAAA,SAAAA,EAAW,IAAIC,IAAAA,EAAAA;AACf1B,YAAAA,OAAAA;YACA2B,MAAAA,EAAQ;AACV,SAAA;QACAzB,IAAAA,EAAM;AACR,KAAA,CAAA;AACF;AAoFA,eAAA,UAAoD0B,IAAO,EAAA;IACzD,IAAI;AACF,QAAA,OAAO,MAAM,IAAI,CAAChE,UAAU,EAAEiE,oBAAAA,CAC5B;YAAEzH,MAAAA,EAAQ,OAAA;AAASwH,YAAAA;AAAK,SAAA,EACxBA,SAAS,QAAA,GAAW;YAAEE,cAAAA,EAAgB1J;SAA6B,GAAIwB,SAAAA,CAAAA;AAE3E,IAAA,CAAA,CAAE,OAAO2D,CAAAA,EAAG;AACV,QAAA,IAAIA,aAAahE,KAAAA,EAAO;YACtB,OAAOgE,CAAAA;AACT,QAAA;QAEA,IAAI,OAAOA,MAAM,QAAA,EAAU;AACzB,YAAA,OAAO,IAAIR,qBAAAA,CAAsBQ,CAAAA,CAAAA;AACnC,QAAA;AAEA,QAAA,OAAO,IAAIR,qBAAAA,CAAsB,kBAAA,CAAA;AACnC,IAAA;AACF;AAEA,eAAA,QAAeuE,IAAY,EAAA;IACzB,OAAO,IAAIlE,OAAAA,CAAQ,CAACC,OAAAA,EAASC,MAAAA,GAAAA;AAC3B,QAAA,IAAI,CAAC6B,EAAE,EAAE4C,IAAAA,CAAKX,IAAAA,CAAKY,SAAS,CAAC;AAAEV,YAAAA;AAAK,SAAA,CAAA,EAAI,CAAC/D,CAAAA,GAAAA;AACvC,YAAA,IAAIA,CAAAA,EAAG;gBACLD,MAAAA,CAAOC,CAAAA,CAAAA;YACT,CAAA,MAAO;gBACLF,OAAAA,CAAQE,CAAAA,CAAAA;AACV,YAAA;AACF,QAAA,CAAA,CAAA;AACF,IAAA,CAAA,CAAA;AACF;AAEA,eAAA,QAAkDqE,IAAO,EAAA;IACvD,IAAI;AACF,QAAA,MAAM,IAAI,CAAChE,UAAU,EAAEiE,oBAAAA,CAAqB;YAAEzH,MAAAA,EAAQ,KAAA;AAAOwH,YAAAA;AAAK,SAAA,CAAA;AACpE,IAAA,CAAA,CAAE,OAAOrE,CAAAA,EAAG;AACV,QAAA,IAAIA,aAAahE,KAAAA,EAAO;YACtB,OAAOgE,CAAAA;AACT,QAAA;QAEA,IAAI,OAAOA,MAAM,QAAA,EAAU;AACzB,YAAA,OAAO,IAAIR,qBAAAA,CAAsBQ,CAAAA,CAAAA;AACnC,QAAA;AAEA,QAAA,OAAO,IAAIR,qBAAAA,CAAsB,kBAAA,CAAA;AACnC,IAAA;IAEA,OAAO,IAAA;AACT;AAGK,MAAMkF,mCAAmC,CAACzI,OAAAA,GAAAA;AAC/C,IAAA,OAAO,IAAIjB,0BAAAA,CAA2BiB,OAAAA,CAAAA;AACxC;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/strapi/remote/flows/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,MAAM,MAAM,IAAI,GACZ;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,aAAa,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAEjE,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAM7D,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC;IACzB,GAAG,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC;IACzB,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC;IAC5B,GAAG,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IACtB,GAAG,IAAI,IAAI,GAAG,IAAI,CAAC;CACpB;AAED,eAAO,MAAM,UAAU,GAAI,MAAM,SAAS,IAAI,EAAE,KAAG,YA+DlD,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/strapi/remote/flows/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,MAAM,MAAM,IAAI,GACd;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,aAAa,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAEpG,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAM7D,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC;IACzB,GAAG,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC;IACzB,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC;IAC5B,GAAG,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IACtB,GAAG,IAAI,IAAI,GAAG,IAAI,CAAC;CACpB;AAED,eAAO,MAAM,UAAU,GAAI,MAAM,SAAS,IAAI,EAAE,KAAG,YA+DlD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../src/strapi/remote/flows/index.ts"],"sourcesContent":["import type { TransferStage } from '../../../types';\n\nexport type Step =\n | { kind: 'action'; action: string }\n | { kind: 'transfer'; stage: TransferStage; locked?: boolean };\n\nexport { default as DEFAULT_TRANSFER_FLOW } from './default';\n\ninterface IState {\n step: Step | null;\n}\n\nexport interface TransferFlow {\n has(step: Step): boolean;\n can(step: Step): boolean;\n cannot(step: Step): boolean;\n set(step: Step): this;\n get(): Step | null;\n}\n\nexport const createFlow = (flow: readonly Step[]): TransferFlow => {\n const state: IState = { step: null };\n\n /**\n * Equality check between two steps\n */\n const stepEqual = (stepA: Step, stepB: Step): boolean => {\n if (stepA.kind === 'action' && stepB.kind === 'action') {\n return stepA.action === stepB.action;\n }\n\n if (stepA.kind === 'transfer' && stepB.kind === 'transfer') {\n return stepA.stage === stepB.stage;\n }\n\n return false;\n };\n\n /**\n * Find the index for a given step\n */\n const findStepIndex = (step: Step) => flow.findIndex((flowStep) => stepEqual(step, flowStep));\n\n return {\n has(step: Step) {\n return findStepIndex(step) !== -1;\n },\n\n can(step: Step) {\n if (state.step === null) {\n return true;\n }\n\n const indexesDifference = findStepIndex(step) - findStepIndex(state.step);\n\n // It's possible to send multiple time the same transfer step in a row\n if (indexesDifference === 0 && step.kind === 'transfer') {\n return true;\n }\n\n return indexesDifference > 0;\n },\n\n cannot(step: Step) {\n return !this.can(step);\n },\n\n set(step: Step) {\n const canSwitch = this.can(step);\n\n if (!canSwitch) {\n throw new Error('Impossible to proceed to the given step');\n }\n\n state.step = step;\n\n return this;\n },\n\n get() {\n return state.step;\n },\n };\n};\n"],"names":["createFlow","flow","state","step","stepEqual","stepA","stepB","kind","action","stage","findStepIndex","findIndex","flowStep","has","can","indexesDifference","cannot","set","canSwitch","Error","get"],"mappings":";;AAoBO,MAAMA,aAAa,CAACC,IAAAA,GAAAA;AACzB,IAAA,MAAMC,KAAAA,GAAgB;QAAEC,IAAAA,EAAM;AAAK,KAAA;AAEnC;;MAGA,MAAMC,SAAAA,GAAY,CAACC,KAAAA,EAAaC,KAAAA,GAAAA;AAC9B,QAAA,IAAID,MAAME,IAAI,KAAK,YAAYD,KAAAA,CAAMC,IAAI,KAAK,QAAA,EAAU;AACtD,YAAA,OAAOF,KAAAA,CAAMG,MAAM,KAAKF,KAAAA,CAAME,MAAM;AACtC,QAAA;AAEA,QAAA,IAAIH,MAAME,IAAI,KAAK,cAAcD,KAAAA,CAAMC,IAAI,KAAK,UAAA,EAAY;AAC1D,YAAA,OAAOF,KAAAA,CAAMI,KAAK,KAAKH,KAAAA,CAAMG,KAAK;AACpC,QAAA;QAEA,OAAO,KAAA;AACT,IAAA,CAAA;AAEA;;MAGA,MAAMC,aAAAA,GAAgB,CAACP,IAAAA,GAAeF,IAAAA,CAAKU,SAAS,CAAC,CAACC,QAAAA,GAAaR,SAAAA,CAAUD,IAAAA,EAAMS,QAAAA,CAAAA,CAAAA;IAEnF,OAAO;AACLC,QAAAA,GAAAA,CAAAA,CAAIV,IAAU,EAAA;YACZ,OAAOO,aAAAA,CAAcP,UAAU,EAAC;AAClC,QAAA,CAAA;AAEAW,QAAAA,GAAAA,CAAAA,CAAIX,IAAU,EAAA;YACZ,IAAID,KAAAA,CAAMC,IAAI,KAAK,IAAA,EAAM;gBACvB,OAAO,IAAA;AACT,YAAA;AAEA,YAAA,MAAMY,iBAAAA,GAAoBL,aAAAA,CAAcP,IAAAA,CAAAA,GAAQO,aAAAA,CAAcR,MAAMC,IAAI,CAAA;;AAGxE,YAAA,IAAIY,iBAAAA,KAAsB,CAAA,IAAKZ,IAAAA,CAAKI,IAAI,KAAK,UAAA,EAAY;gBACvD,OAAO,IAAA;AACT,YAAA;AAEA,YAAA,OAAOQ,iBAAAA,GAAoB,CAAA;AAC7B,QAAA,CAAA;AAEAC,QAAAA,MAAAA,CAAAA,CAAOb,IAAU,EAAA;AACf,YAAA,OAAO,CAAC,IAAI,CAACW,GAAG,CAACX,IAAAA,CAAAA;AACnB,QAAA,CAAA;AAEAc,QAAAA,GAAAA,CAAAA,CAAId,IAAU,EAAA;AACZ,YAAA,MAAMe,SAAAA,GAAY,IAAI,CAACJ,GAAG,CAACX,IAAAA,CAAAA;AAE3B,YAAA,IAAI,CAACe,SAAAA,EAAW;AACd,gBAAA,MAAM,IAAIC,KAAAA,CAAM,yCAAA,CAAA;AAClB,YAAA;AAEAjB,YAAAA,KAAAA,CAAMC,IAAI,GAAGA,IAAAA;AAEb,YAAA,OAAO,IAAI;AACb,QAAA,CAAA;AAEAiB,QAAAA,GAAAA,CAAAA,GAAAA;AACE,YAAA,OAAOlB,MAAMC,IAAI;AACnB,QAAA;AACF,KAAA;AACF;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../../../src/strapi/remote/flows/index.ts"],"sourcesContent":["import type { TransferStage } from '../../../types';\n\nexport type Step =\n { kind: 'action'; action: string } | { kind: 'transfer'; stage: TransferStage; locked?: boolean };\n\nexport { default as DEFAULT_TRANSFER_FLOW } from './default';\n\ninterface IState {\n step: Step | null;\n}\n\nexport interface TransferFlow {\n has(step: Step): boolean;\n can(step: Step): boolean;\n cannot(step: Step): boolean;\n set(step: Step): this;\n get(): Step | null;\n}\n\nexport const createFlow = (flow: readonly Step[]): TransferFlow => {\n const state: IState = { step: null };\n\n /**\n * Equality check between two steps\n */\n const stepEqual = (stepA: Step, stepB: Step): boolean => {\n if (stepA.kind === 'action' && stepB.kind === 'action') {\n return stepA.action === stepB.action;\n }\n\n if (stepA.kind === 'transfer' && stepB.kind === 'transfer') {\n return stepA.stage === stepB.stage;\n }\n\n return false;\n };\n\n /**\n * Find the index for a given step\n */\n const findStepIndex = (step: Step) => flow.findIndex((flowStep) => stepEqual(step, flowStep));\n\n return {\n has(step: Step) {\n return findStepIndex(step) !== -1;\n },\n\n can(step: Step) {\n if (state.step === null) {\n return true;\n }\n\n const indexesDifference = findStepIndex(step) - findStepIndex(state.step);\n\n // It's possible to send multiple time the same transfer step in a row\n if (indexesDifference === 0 && step.kind === 'transfer') {\n return true;\n }\n\n return indexesDifference > 0;\n },\n\n cannot(step: Step) {\n return !this.can(step);\n },\n\n set(step: Step) {\n const canSwitch = this.can(step);\n\n if (!canSwitch) {\n throw new Error('Impossible to proceed to the given step');\n }\n\n state.step = step;\n\n return this;\n },\n\n get() {\n return state.step;\n },\n };\n};\n"],"names":["createFlow","flow","state","step","stepEqual","stepA","stepB","kind","action","stage","findStepIndex","findIndex","flowStep","has","can","indexesDifference","cannot","set","canSwitch","Error","get"],"mappings":";;AAmBO,MAAMA,aAAa,CAACC,IAAAA,GAAAA;AACzB,IAAA,MAAMC,KAAAA,GAAgB;QAAEC,IAAAA,EAAM;AAAK,KAAA;AAEnC;;MAGA,MAAMC,SAAAA,GAAY,CAACC,KAAAA,EAAaC,KAAAA,GAAAA;AAC9B,QAAA,IAAID,MAAME,IAAI,KAAK,YAAYD,KAAAA,CAAMC,IAAI,KAAK,QAAA,EAAU;AACtD,YAAA,OAAOF,KAAAA,CAAMG,MAAM,KAAKF,KAAAA,CAAME,MAAM;AACtC,QAAA;AAEA,QAAA,IAAIH,MAAME,IAAI,KAAK,cAAcD,KAAAA,CAAMC,IAAI,KAAK,UAAA,EAAY;AAC1D,YAAA,OAAOF,KAAAA,CAAMI,KAAK,KAAKH,KAAAA,CAAMG,KAAK;AACpC,QAAA;QAEA,OAAO,KAAA;AACT,IAAA,CAAA;AAEA;;MAGA,MAAMC,aAAAA,GAAgB,CAACP,IAAAA,GAAeF,IAAAA,CAAKU,SAAS,CAAC,CAACC,QAAAA,GAAaR,SAAAA,CAAUD,IAAAA,EAAMS,QAAAA,CAAAA,CAAAA;IAEnF,OAAO;AACLC,QAAAA,GAAAA,CAAAA,CAAIV,IAAU,EAAA;YACZ,OAAOO,aAAAA,CAAcP,UAAU,EAAC;AAClC,QAAA,CAAA;AAEAW,QAAAA,GAAAA,CAAAA,CAAIX,IAAU,EAAA;YACZ,IAAID,KAAAA,CAAMC,IAAI,KAAK,IAAA,EAAM;gBACvB,OAAO,IAAA;AACT,YAAA;AAEA,YAAA,MAAMY,iBAAAA,GAAoBL,aAAAA,CAAcP,IAAAA,CAAAA,GAAQO,aAAAA,CAAcR,MAAMC,IAAI,CAAA;;AAGxE,YAAA,IAAIY,iBAAAA,KAAsB,CAAA,IAAKZ,IAAAA,CAAKI,IAAI,KAAK,UAAA,EAAY;gBACvD,OAAO,IAAA;AACT,YAAA;AAEA,YAAA,OAAOQ,iBAAAA,GAAoB,CAAA;AAC7B,QAAA,CAAA;AAEAC,QAAAA,MAAAA,CAAAA,CAAOb,IAAU,EAAA;AACf,YAAA,OAAO,CAAC,IAAI,CAACW,GAAG,CAACX,IAAAA,CAAAA;AACnB,QAAA,CAAA;AAEAc,QAAAA,GAAAA,CAAAA,CAAId,IAAU,EAAA;AACZ,YAAA,MAAMe,SAAAA,GAAY,IAAI,CAACJ,GAAG,CAACX,IAAAA,CAAAA;AAE3B,YAAA,IAAI,CAACe,SAAAA,EAAW;AACd,gBAAA,MAAM,IAAIC,KAAAA,CAAM,yCAAA,CAAA;AAClB,YAAA;AAEAjB,YAAAA,KAAAA,CAAMC,IAAI,GAAGA,IAAAA;AAEb,YAAA,OAAO,IAAI;AACb,QAAA,CAAA;AAEAiB,QAAAA,GAAAA,CAAAA,GAAAA;AACE,YAAA,OAAOlB,MAAMC,IAAI;AACnB,QAAA;AACF,KAAA;AACF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../../src/strapi/remote/flows/index.ts"],"sourcesContent":["import type { TransferStage } from '../../../types';\n\nexport type Step =\n | { kind: 'action'; action: string }\n | { kind: 'transfer'; stage: TransferStage; locked?: boolean };\n\nexport { default as DEFAULT_TRANSFER_FLOW } from './default';\n\ninterface IState {\n step: Step | null;\n}\n\nexport interface TransferFlow {\n has(step: Step): boolean;\n can(step: Step): boolean;\n cannot(step: Step): boolean;\n set(step: Step): this;\n get(): Step | null;\n}\n\nexport const createFlow = (flow: readonly Step[]): TransferFlow => {\n const state: IState = { step: null };\n\n /**\n * Equality check between two steps\n */\n const stepEqual = (stepA: Step, stepB: Step): boolean => {\n if (stepA.kind === 'action' && stepB.kind === 'action') {\n return stepA.action === stepB.action;\n }\n\n if (stepA.kind === 'transfer' && stepB.kind === 'transfer') {\n return stepA.stage === stepB.stage;\n }\n\n return false;\n };\n\n /**\n * Find the index for a given step\n */\n const findStepIndex = (step: Step) => flow.findIndex((flowStep) => stepEqual(step, flowStep));\n\n return {\n has(step: Step) {\n return findStepIndex(step) !== -1;\n },\n\n can(step: Step) {\n if (state.step === null) {\n return true;\n }\n\n const indexesDifference = findStepIndex(step) - findStepIndex(state.step);\n\n // It's possible to send multiple time the same transfer step in a row\n if (indexesDifference === 0 && step.kind === 'transfer') {\n return true;\n }\n\n return indexesDifference > 0;\n },\n\n cannot(step: Step) {\n return !this.can(step);\n },\n\n set(step: Step) {\n const canSwitch = this.can(step);\n\n if (!canSwitch) {\n throw new Error('Impossible to proceed to the given step');\n }\n\n state.step = step;\n\n return this;\n },\n\n get() {\n return state.step;\n },\n };\n};\n"],"names":["createFlow","flow","state","step","stepEqual","stepA","stepB","kind","action","stage","findStepIndex","findIndex","flowStep","has","can","indexesDifference","cannot","set","canSwitch","Error","get"],"mappings":"AAoBO,MAAMA,aAAa,CAACC,IAAAA,GAAAA;AACzB,IAAA,MAAMC,KAAAA,GAAgB;QAAEC,IAAAA,EAAM;AAAK,KAAA;AAEnC;;MAGA,MAAMC,SAAAA,GAAY,CAACC,KAAAA,EAAaC,KAAAA,GAAAA;AAC9B,QAAA,IAAID,MAAME,IAAI,KAAK,YAAYD,KAAAA,CAAMC,IAAI,KAAK,QAAA,EAAU;AACtD,YAAA,OAAOF,KAAAA,CAAMG,MAAM,KAAKF,KAAAA,CAAME,MAAM;AACtC,QAAA;AAEA,QAAA,IAAIH,MAAME,IAAI,KAAK,cAAcD,KAAAA,CAAMC,IAAI,KAAK,UAAA,EAAY;AAC1D,YAAA,OAAOF,KAAAA,CAAMI,KAAK,KAAKH,KAAAA,CAAMG,KAAK;AACpC,QAAA;QAEA,OAAO,KAAA;AACT,IAAA,CAAA;AAEA;;MAGA,MAAMC,aAAAA,GAAgB,CAACP,IAAAA,GAAeF,IAAAA,CAAKU,SAAS,CAAC,CAACC,QAAAA,GAAaR,SAAAA,CAAUD,IAAAA,EAAMS,QAAAA,CAAAA,CAAAA;IAEnF,OAAO;AACLC,QAAAA,GAAAA,CAAAA,CAAIV,IAAU,EAAA;YACZ,OAAOO,aAAAA,CAAcP,UAAU,EAAC;AAClC,QAAA,CAAA;AAEAW,QAAAA,GAAAA,CAAAA,CAAIX,IAAU,EAAA;YACZ,IAAID,KAAAA,CAAMC,IAAI,KAAK,IAAA,EAAM;gBACvB,OAAO,IAAA;AACT,YAAA;AAEA,YAAA,MAAMY,iBAAAA,GAAoBL,aAAAA,CAAcP,IAAAA,CAAAA,GAAQO,aAAAA,CAAcR,MAAMC,IAAI,CAAA;;AAGxE,YAAA,IAAIY,iBAAAA,KAAsB,CAAA,IAAKZ,IAAAA,CAAKI,IAAI,KAAK,UAAA,EAAY;gBACvD,OAAO,IAAA;AACT,YAAA;AAEA,YAAA,OAAOQ,iBAAAA,GAAoB,CAAA;AAC7B,QAAA,CAAA;AAEAC,QAAAA,MAAAA,CAAAA,CAAOb,IAAU,EAAA;AACf,YAAA,OAAO,CAAC,IAAI,CAACW,GAAG,CAACX,IAAAA,CAAAA;AACnB,QAAA,CAAA;AAEAc,QAAAA,GAAAA,CAAAA,CAAId,IAAU,EAAA;AACZ,YAAA,MAAMe,SAAAA,GAAY,IAAI,CAACJ,GAAG,CAACX,IAAAA,CAAAA;AAE3B,YAAA,IAAI,CAACe,SAAAA,EAAW;AACd,gBAAA,MAAM,IAAIC,KAAAA,CAAM,yCAAA,CAAA;AAClB,YAAA;AAEAjB,YAAAA,KAAAA,CAAMC,IAAI,GAAGA,IAAAA;AAEb,YAAA,OAAO,IAAI;AACb,QAAA,CAAA;AAEAiB,QAAAA,GAAAA,CAAAA,GAAAA;AACE,YAAA,OAAOlB,MAAMC,IAAI;AACnB,QAAA;AACF,KAAA;AACF;;;;"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../../src/strapi/remote/flows/index.ts"],"sourcesContent":["import type { TransferStage } from '../../../types';\n\nexport type Step =\n { kind: 'action'; action: string } | { kind: 'transfer'; stage: TransferStage; locked?: boolean };\n\nexport { default as DEFAULT_TRANSFER_FLOW } from './default';\n\ninterface IState {\n step: Step | null;\n}\n\nexport interface TransferFlow {\n has(step: Step): boolean;\n can(step: Step): boolean;\n cannot(step: Step): boolean;\n set(step: Step): this;\n get(): Step | null;\n}\n\nexport const createFlow = (flow: readonly Step[]): TransferFlow => {\n const state: IState = { step: null };\n\n /**\n * Equality check between two steps\n */\n const stepEqual = (stepA: Step, stepB: Step): boolean => {\n if (stepA.kind === 'action' && stepB.kind === 'action') {\n return stepA.action === stepB.action;\n }\n\n if (stepA.kind === 'transfer' && stepB.kind === 'transfer') {\n return stepA.stage === stepB.stage;\n }\n\n return false;\n };\n\n /**\n * Find the index for a given step\n */\n const findStepIndex = (step: Step) => flow.findIndex((flowStep) => stepEqual(step, flowStep));\n\n return {\n has(step: Step) {\n return findStepIndex(step) !== -1;\n },\n\n can(step: Step) {\n if (state.step === null) {\n return true;\n }\n\n const indexesDifference = findStepIndex(step) - findStepIndex(state.step);\n\n // It's possible to send multiple time the same transfer step in a row\n if (indexesDifference === 0 && step.kind === 'transfer') {\n return true;\n }\n\n return indexesDifference > 0;\n },\n\n cannot(step: Step) {\n return !this.can(step);\n },\n\n set(step: Step) {\n const canSwitch = this.can(step);\n\n if (!canSwitch) {\n throw new Error('Impossible to proceed to the given step');\n }\n\n state.step = step;\n\n return this;\n },\n\n get() {\n return state.step;\n },\n };\n};\n"],"names":["createFlow","flow","state","step","stepEqual","stepA","stepB","kind","action","stage","findStepIndex","findIndex","flowStep","has","can","indexesDifference","cannot","set","canSwitch","Error","get"],"mappings":"AAmBO,MAAMA,aAAa,CAACC,IAAAA,GAAAA;AACzB,IAAA,MAAMC,KAAAA,GAAgB;QAAEC,IAAAA,EAAM;AAAK,KAAA;AAEnC;;MAGA,MAAMC,SAAAA,GAAY,CAACC,KAAAA,EAAaC,KAAAA,GAAAA;AAC9B,QAAA,IAAID,MAAME,IAAI,KAAK,YAAYD,KAAAA,CAAMC,IAAI,KAAK,QAAA,EAAU;AACtD,YAAA,OAAOF,KAAAA,CAAMG,MAAM,KAAKF,KAAAA,CAAME,MAAM;AACtC,QAAA;AAEA,QAAA,IAAIH,MAAME,IAAI,KAAK,cAAcD,KAAAA,CAAMC,IAAI,KAAK,UAAA,EAAY;AAC1D,YAAA,OAAOF,KAAAA,CAAMI,KAAK,KAAKH,KAAAA,CAAMG,KAAK;AACpC,QAAA;QAEA,OAAO,KAAA;AACT,IAAA,CAAA;AAEA;;MAGA,MAAMC,aAAAA,GAAgB,CAACP,IAAAA,GAAeF,IAAAA,CAAKU,SAAS,CAAC,CAACC,QAAAA,GAAaR,SAAAA,CAAUD,IAAAA,EAAMS,QAAAA,CAAAA,CAAAA;IAEnF,OAAO;AACLC,QAAAA,GAAAA,CAAAA,CAAIV,IAAU,EAAA;YACZ,OAAOO,aAAAA,CAAcP,UAAU,EAAC;AAClC,QAAA,CAAA;AAEAW,QAAAA,GAAAA,CAAAA,CAAIX,IAAU,EAAA;YACZ,IAAID,KAAAA,CAAMC,IAAI,KAAK,IAAA,EAAM;gBACvB,OAAO,IAAA;AACT,YAAA;AAEA,YAAA,MAAMY,iBAAAA,GAAoBL,aAAAA,CAAcP,IAAAA,CAAAA,GAAQO,aAAAA,CAAcR,MAAMC,IAAI,CAAA;;AAGxE,YAAA,IAAIY,iBAAAA,KAAsB,CAAA,IAAKZ,IAAAA,CAAKI,IAAI,KAAK,UAAA,EAAY;gBACvD,OAAO,IAAA;AACT,YAAA;AAEA,YAAA,OAAOQ,iBAAAA,GAAoB,CAAA;AAC7B,QAAA,CAAA;AAEAC,QAAAA,MAAAA,CAAAA,CAAOb,IAAU,EAAA;AACf,YAAA,OAAO,CAAC,IAAI,CAACW,GAAG,CAACX,IAAAA,CAAAA;AACnB,QAAA,CAAA;AAEAc,QAAAA,GAAAA,CAAAA,CAAId,IAAU,EAAA;AACZ,YAAA,MAAMe,SAAAA,GAAY,IAAI,CAACJ,GAAG,CAACX,IAAAA,CAAAA;AAE3B,YAAA,IAAI,CAACe,SAAAA,EAAW;AACd,gBAAA,MAAM,IAAIC,KAAAA,CAAM,yCAAA,CAAA;AAClB,YAAA;AAEAjB,YAAAA,KAAAA,CAAMC,IAAI,GAAGA,IAAAA;AAEb,YAAA,OAAO,IAAI;AACb,QAAA,CAAA;AAEAiB,QAAAA,GAAAA,CAAAA,GAAAA;AACE,YAAA,OAAOlB,MAAMC,IAAI;AACnB,QAAA;AACF,KAAA;AACF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"pull.d.ts","sourceRoot":"","sources":["../../../../src/strapi/remote/handlers/pull.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAIlC,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAMrC,OAAO,EAGL,0BAA0B,EAC3B,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,EAA+B,aAAa,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAI3F,QAAA,MAAM,sBAAsB,8DAA+D,CAAC;AAE5F,KAAK,kBAAkB,GAAG,CAAC,OAAO,sBAAsB,CAAC,CAAC,MAAM,CAAC,CAAC;AAElE,MAAM,WAAW,WAAY,SAAQ,OAAO;IAC1C,QAAQ,CAAC,EAAE,0BAA0B,CAAC;IAEtC,OAAO,CAAC,EAAE;SAAG,KAAK,IAAI,aAAa,CAAC,CAAC,EAAE,QAAQ;KAAE,CAAC;IAClD,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,kBAAkB,CAAC;IAEhF,iBAAiB,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;IACpF,gBAAgB,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;IAC1E,cAAc,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,mBAAmB,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;IAErF,2BAA2B,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEhE,KAAK,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CAC/D;AAED,eAAO,MAAM,oBAAoB,kDAiIxB,0BAAY,kBA0PlB,CAAC"}
1
+ {"version":3,"file":"pull.d.ts","sourceRoot":"","sources":["../../../../src/strapi/remote/handlers/pull.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAIlC,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAMrC,OAAO,EAGL,0BAA0B,EAC3B,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,EAA+B,aAAa,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAI3F,QAAA,MAAM,sBAAsB,8DAA+D,CAAC;AAE5F,KAAK,kBAAkB,GAAG,CAAC,OAAO,sBAAsB,CAAC,CAAC,MAAM,CAAC,CAAC;AAElE,MAAM,WAAW,WAAY,SAAQ,OAAO;IAC1C,QAAQ,CAAC,EAAE,0BAA0B,CAAC;IAEtC,OAAO,CAAC,EAAE;SAAG,KAAK,IAAI,aAAa,CAAC,CAAC,EAAE,QAAQ;KAAE,CAAC;IAClD,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,kBAAkB,CAAC;IAEhF,iBAAiB,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;IACpF,gBAAgB,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;IAC1E,cAAc,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,mBAAmB,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;IAErF,2BAA2B,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEhE,KAAK,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CAC/D;AAED,eAAO,MAAM,oBAAoB,kDAiIzB,0BAAY,kBA0PjB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"push.d.ts","sourceRoot":"","sources":["../../../../src/strapi/remote/handlers/push.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"push.d.ts","sourceRoot":"","sources":["../../../../src/strapi/remote/handlers/push.ts"],"names":[],"mappings":"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"}
@@ -100,7 +100,7 @@ const isDataTransferMessage = (message)=>{
100
100
  // Protocol related functions
101
101
  const handlerControllerFactory = (implementation)=>(options)=>{
102
102
  const { verify, server: serverOptions } = options ?? {};
103
- const wss = new ws.WebSocket.Server({
103
+ const wss = new ws.WebSocketServer({
104
104
  ...serverOptions,
105
105
  noServer: true
106
106
  });
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sources":["../../../../src/strapi/remote/handlers/utils.ts"],"sourcesContent":["import type { IncomingMessage } from 'node:http';\nimport { randomUUID } from 'crypto';\nimport type { Context } from 'koa';\nimport type { RawData, ServerOptions } from 'ws';\nimport { WebSocket, WebSocketServer } from 'ws';\n\nimport type { Handler, TransferState } from './abstract';\nimport type { Protocol } from '../../../types';\nimport { ProviderError, ProviderTransferError } from '../../../errors/providers';\nimport { VALID_TRANSFER_COMMANDS, ValidTransferCommand } from './constants';\nimport { TransferMethod } from '../constants';\nimport { createDiagnosticReporter } from '../../../utils/diagnostic';\nimport { stringifyTransferWebSocketPayload } from '../../../utils/transfer-websocket-json';\n\ntype WSCallback = (client: WebSocket, request: IncomingMessage) => void;\n\nexport interface HandlerOptions {\n verify: (ctx: Context, scope?: TransferMethod) => Promise<void>;\n server?: ServerOptions;\n}\n\nexport const transformUpgradeHeader = (header = '') => {\n return header.split(',').map((s) => s.trim().toLowerCase());\n};\n\nlet timeouts: Record<string, number> | undefined;\n\nconst hasHttpServer = () => {\n // during server restarts, strapi may not have ever been defined at all, so we have to check it first\n return typeof strapi !== 'undefined' && !!strapi?.server?.httpServer;\n};\n\n// temporarily disable server timeouts while transfer is running\nconst disableTimeouts = () => {\n if (!hasHttpServer()) {\n return;\n }\n\n const { httpServer } = strapi.server;\n\n // save the original timeouts to restore after\n if (!timeouts) {\n timeouts = {\n headersTimeout: httpServer.headersTimeout,\n requestTimeout: httpServer.requestTimeout,\n };\n }\n\n httpServer.headersTimeout = 0;\n httpServer.requestTimeout = 0;\n\n strapi.log.info('[Data transfer] Disabling http timeouts');\n};\nconst resetTimeouts = () => {\n if (!hasHttpServer() || !timeouts) {\n return;\n }\n\n const { httpServer } = strapi.server;\n\n strapi.log.info('[Data transfer] Restoring http timeouts');\n httpServer.headersTimeout = timeouts.headersTimeout;\n httpServer.requestTimeout = timeouts.requestTimeout;\n};\n/**\n * Make sure that the upgrade header is a valid websocket one\n */\nexport const assertValidHeader = (ctx: Context) => {\n // if it's exactly what we expect, it's fine\n if (ctx.headers.upgrade === 'websocket') {\n return;\n }\n\n // check if it could be an array that still includes websocket\n const upgradeHeader = transformUpgradeHeader(ctx.headers.upgrade);\n\n // Sanitize user input before writing it to our logs\n const logSafeUpgradeHeader = JSON.stringify(ctx.headers.upgrade)\n ?.replace(/[^a-z0-9\\s.,|]/gi, '')\n .substring(0, 50);\n\n if (!upgradeHeader.includes('websocket')) {\n throw new Error(\n `Transfer Upgrade header expected 'websocket', found '${logSafeUpgradeHeader}'. Please ensure that your server or proxy is not modifying the Upgrade header.`\n );\n }\n\n /**\n * If there's more than expected but it still includes websocket, in theory it could still work\n * and could be necessary for their certain configurations, so we'll allow it to proceed but\n * log the unexpected behaviour in case it helps debug an issue\n * */\n strapi.log.info(\n `Transfer Upgrade header expected only 'websocket', found unexpected values: ${logSafeUpgradeHeader}`\n );\n};\n\nexport const isDataTransferMessage = (message: unknown): message is Protocol.Client.Message => {\n if (!message || typeof message !== 'object') {\n return false;\n }\n\n const { uuid, type } = message as Record<string, unknown>;\n\n if (typeof uuid !== 'string' || typeof type !== 'string') {\n return false;\n }\n\n if (!['command', 'transfer'].includes(type)) {\n return false;\n }\n\n return true;\n};\n\n/**\n * Handle the upgrade to ws connection\n */\nexport const handleWSUpgrade = (wss: WebSocketServer, ctx: Context, callback: WSCallback) => {\n assertValidHeader(ctx);\n\n wss.handleUpgrade(ctx.req, ctx.request.socket, Buffer.alloc(0), (client, request) => {\n if (!client) {\n // If the WebSocket upgrade failed, destroy the socket to avoid hanging\n ctx.request.socket.destroy();\n return;\n }\n\n disableTimeouts();\n strapi.db.lifecycles.disable();\n strapi.log.info('[Data transfer] Disabling lifecycle hooks');\n\n // Create a connection between the client & the server\n wss.emit('connection', client, ctx.req);\n\n // Invoke the ws callback\n callback(client, request);\n });\n\n ctx.respond = false;\n};\n\n// Protocol related functions\n\nexport const handlerControllerFactory =\n <T extends Partial<Handler>>(implementation: (proto: Handler) => T) =>\n (options: HandlerOptions) => {\n const { verify, server: serverOptions } = options ?? {};\n\n const wss = new WebSocket.Server({ ...serverOptions, noServer: true });\n\n return async (ctx: Context) => {\n const cb: WSCallback = (ws) => {\n const state: TransferState = { id: undefined };\n const messageUUIDs = new Set<string>();\n const diagnostics = createDiagnosticReporter();\n\n const cannotRespondHandler = (err: unknown) => {\n strapi?.log?.error(\n '[Data transfer] Cannot send error response to client, closing connection'\n );\n strapi?.log?.error(err);\n try {\n ws.terminate();\n ctx.req.socket.destroy();\n } catch {\n strapi?.log?.error('[Data transfer] Failed to close socket on error');\n }\n };\n\n const prototype: Handler = {\n // Transfer ID\n get transferID() {\n return state.id;\n },\n\n set transferID(id) {\n state.id = id;\n },\n\n // Started at\n get startedAt() {\n return state.startedAt;\n },\n\n set startedAt(timestamp) {\n state.startedAt = timestamp;\n },\n\n get response() {\n return state.response;\n },\n\n set response(response) {\n state.response = response;\n },\n\n get diagnostics() {\n return diagnostics;\n },\n\n addUUID(uuid) {\n messageUUIDs.add(uuid);\n },\n\n hasUUID(uuid) {\n return messageUUIDs.has(uuid);\n },\n\n isTransferStarted() {\n return this.transferID !== undefined && this.startedAt !== undefined;\n },\n\n assertValidTransfer() {\n const isStarted = this.isTransferStarted();\n\n if (!isStarted) {\n throw new Error('Invalid Transfer Process');\n }\n },\n\n assertValidTransferCommand(command: ValidTransferCommand) {\n const isDefined = typeof this[command] === 'function';\n const isValidTransferCommand = VALID_TRANSFER_COMMANDS.includes(command);\n\n if (!isDefined || !isValidTransferCommand) {\n throw new Error('Invalid transfer command');\n }\n },\n\n async respond(uuid, e, data) {\n let details = {};\n return new Promise<void>((resolve, reject) => {\n if (!uuid && !e) {\n reject(new Error('Missing uuid for this message'));\n return;\n }\n\n this.response = {\n uuid,\n data,\n e,\n };\n\n if (e instanceof ProviderError) {\n details = e.details;\n }\n\n const envelope: Record<string, unknown> = {\n uuid,\n data: data ?? null,\n error: e\n ? {\n code: e?.name ?? 'ERR',\n message: e?.message,\n details,\n }\n : null,\n };\n\n const payload = stringifyTransferWebSocketPayload(envelope);\n\n this.send(payload, (error) => (error ? reject(error) : resolve()));\n });\n },\n\n send(message, cb) {\n ws.send(message, cb);\n },\n confirm(message) {\n return new Promise((resolve, reject) => {\n const uuid = randomUUID();\n\n const payload = stringifyTransferWebSocketPayload({ uuid, data: message });\n\n this.send(payload, (error) => {\n if (error) {\n reject(error);\n }\n });\n\n const onResponse = (raw: RawData) => {\n const response = JSON.parse(raw.toString());\n\n if (response.uuid === uuid) {\n resolve(response.data ?? null);\n } else {\n ws.once('message', onResponse);\n }\n };\n\n ws.once('message', onResponse);\n });\n },\n\n async executeAndRespond(uuid, fn) {\n try {\n const response = await fn();\n await this.respond(uuid, null, response);\n } catch (e) {\n if (e instanceof Error) {\n await this.respond(uuid, e).catch(cannotRespondHandler);\n } else if (typeof e === 'string') {\n await this.respond(uuid, new ProviderTransferError(e)).catch(cannotRespondHandler);\n } else {\n await this.respond(\n uuid,\n new ProviderTransferError('Unexpected error', {\n error: e,\n })\n ).catch(cannotRespondHandler);\n }\n }\n },\n\n cleanup() {\n this.transferID = undefined;\n this.startedAt = undefined;\n this.response = undefined;\n },\n\n teardown() {\n this.cleanup();\n },\n\n verifyAuth(scope?: TransferMethod) {\n return verify(ctx, scope);\n },\n\n // Transfer commands\n init() {},\n end() {},\n status() {},\n\n // Default prototype implementation for events\n onMessage() {},\n onError() {},\n onClose() {},\n onInfo() {},\n onWarning() {},\n };\n\n const handler: Handler = Object.assign(Object.create(prototype), implementation(prototype));\n\n // Bind ws events to handler methods\n ws.on('close', async (...args) => {\n try {\n await handler.onClose(...args);\n } catch (err) {\n strapi?.log?.error('[Data transfer] Uncaught error closing connection');\n strapi?.log?.error(err);\n cannotRespondHandler(err);\n } finally {\n resetTimeouts();\n strapi.db.lifecycles.enable();\n strapi.log.info('[Data transfer] Restoring lifecycle hooks');\n }\n });\n ws.on('error', async (...args) => {\n try {\n await handler.onError(...args);\n } catch (err) {\n strapi?.log?.error('[Data transfer] Uncaught error in error handling');\n strapi?.log?.error(err);\n cannotRespondHandler(err);\n }\n });\n ws.on('message', async (...args) => {\n try {\n await handler.onMessage(...args);\n } catch (err) {\n strapi?.log?.error('[Data transfer] Uncaught error in message handling');\n strapi?.log?.error(err);\n cannotRespondHandler(err);\n }\n });\n\n diagnostics.onDiagnostic((diagnostic) => {\n const uuid = randomUUID();\n const payload = JSON.stringify({\n diagnostic,\n uuid,\n });\n\n handler.send(payload);\n });\n };\n\n try {\n handleWSUpgrade(wss, ctx, cb);\n } catch (err) {\n strapi?.log?.error('[Data transfer] Error in websocket upgrade request');\n strapi?.log?.error(err);\n }\n };\n };\n"],"names":["transformUpgradeHeader","header","split","map","s","trim","toLowerCase","timeouts","hasHttpServer","strapi","server","httpServer","disableTimeouts","headersTimeout","requestTimeout","log","info","resetTimeouts","assertValidHeader","ctx","headers","upgrade","upgradeHeader","logSafeUpgradeHeader","JSON","stringify","replace","substring","includes","Error","isDataTransferMessage","message","uuid","type","handleWSUpgrade","wss","callback","handleUpgrade","req","request","socket","Buffer","alloc","client","destroy","db","lifecycles","disable","emit","respond","handlerControllerFactory","implementation","options","verify","serverOptions","WebSocket","Server","noServer","cb","ws","state","id","undefined","messageUUIDs","Set","diagnostics","createDiagnosticReporter","cannotRespondHandler","err","error","terminate","prototype","transferID","startedAt","timestamp","response","addUUID","add","hasUUID","has","isTransferStarted","assertValidTransfer","isStarted","assertValidTransferCommand","command","isDefined","isValidTransferCommand","VALID_TRANSFER_COMMANDS","e","data","details","Promise","resolve","reject","ProviderError","envelope","code","name","payload","stringifyTransferWebSocketPayload","send","confirm","randomUUID","onResponse","raw","parse","toString","once","executeAndRespond","fn","catch","ProviderTransferError","cleanup","teardown","verifyAuth","scope","init","end","status","onMessage","onError","onClose","onInfo","onWarning","handler","Object","assign","create","on","args","enable","onDiagnostic","diagnostic"],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","sources":["../../../../src/strapi/remote/handlers/utils.ts"],"sourcesContent":["import type { IncomingMessage } from 'node:http';\nimport { randomUUID } from 'crypto';\nimport type { Context } from 'koa';\nimport type { RawData, ServerOptions } from 'ws';\nimport { WebSocket, WebSocketServer } from 'ws';\n\nimport type { Handler, TransferState } from './abstract';\nimport type { Protocol } from '../../../types';\nimport { ProviderError, ProviderTransferError } from '../../../errors/providers';\nimport { VALID_TRANSFER_COMMANDS, ValidTransferCommand } from './constants';\nimport { TransferMethod } from '../constants';\nimport { createDiagnosticReporter } from '../../../utils/diagnostic';\nimport { stringifyTransferWebSocketPayload } from '../../../utils/transfer-websocket-json';\n\ntype WSCallback = (client: WebSocket, request: IncomingMessage) => void;\n\nexport interface HandlerOptions {\n verify: (ctx: Context, scope?: TransferMethod) => Promise<void>;\n server?: ServerOptions;\n}\n\nexport const transformUpgradeHeader = (header = '') => {\n return header.split(',').map((s) => s.trim().toLowerCase());\n};\n\nlet timeouts: Record<string, number> | undefined;\n\nconst hasHttpServer = () => {\n // during server restarts, strapi may not have ever been defined at all, so we have to check it first\n return typeof strapi !== 'undefined' && !!strapi?.server?.httpServer;\n};\n\n// temporarily disable server timeouts while transfer is running\nconst disableTimeouts = () => {\n if (!hasHttpServer()) {\n return;\n }\n\n const { httpServer } = strapi.server;\n\n // save the original timeouts to restore after\n if (!timeouts) {\n timeouts = {\n headersTimeout: httpServer.headersTimeout,\n requestTimeout: httpServer.requestTimeout,\n };\n }\n\n httpServer.headersTimeout = 0;\n httpServer.requestTimeout = 0;\n\n strapi.log.info('[Data transfer] Disabling http timeouts');\n};\nconst resetTimeouts = () => {\n if (!hasHttpServer() || !timeouts) {\n return;\n }\n\n const { httpServer } = strapi.server;\n\n strapi.log.info('[Data transfer] Restoring http timeouts');\n httpServer.headersTimeout = timeouts.headersTimeout;\n httpServer.requestTimeout = timeouts.requestTimeout;\n};\n/**\n * Make sure that the upgrade header is a valid websocket one\n */\nexport const assertValidHeader = (ctx: Context) => {\n // if it's exactly what we expect, it's fine\n if (ctx.headers.upgrade === 'websocket') {\n return;\n }\n\n // check if it could be an array that still includes websocket\n const upgradeHeader = transformUpgradeHeader(ctx.headers.upgrade);\n\n // Sanitize user input before writing it to our logs\n const logSafeUpgradeHeader = JSON.stringify(ctx.headers.upgrade)\n ?.replace(/[^a-z0-9\\s.,|]/gi, '')\n .substring(0, 50);\n\n if (!upgradeHeader.includes('websocket')) {\n throw new Error(\n `Transfer Upgrade header expected 'websocket', found '${logSafeUpgradeHeader}'. Please ensure that your server or proxy is not modifying the Upgrade header.`\n );\n }\n\n /**\n * If there's more than expected but it still includes websocket, in theory it could still work\n * and could be necessary for their certain configurations, so we'll allow it to proceed but\n * log the unexpected behaviour in case it helps debug an issue\n * */\n strapi.log.info(\n `Transfer Upgrade header expected only 'websocket', found unexpected values: ${logSafeUpgradeHeader}`\n );\n};\n\nexport const isDataTransferMessage = (message: unknown): message is Protocol.Client.Message => {\n if (!message || typeof message !== 'object') {\n return false;\n }\n\n const { uuid, type } = message as Record<string, unknown>;\n\n if (typeof uuid !== 'string' || typeof type !== 'string') {\n return false;\n }\n\n if (!['command', 'transfer'].includes(type)) {\n return false;\n }\n\n return true;\n};\n\n/**\n * Handle the upgrade to ws connection\n */\nexport const handleWSUpgrade = (wss: WebSocketServer, ctx: Context, callback: WSCallback) => {\n assertValidHeader(ctx);\n\n wss.handleUpgrade(ctx.req, ctx.request.socket, Buffer.alloc(0), (client, request) => {\n if (!client) {\n // If the WebSocket upgrade failed, destroy the socket to avoid hanging\n ctx.request.socket.destroy();\n return;\n }\n\n disableTimeouts();\n strapi.db.lifecycles.disable();\n strapi.log.info('[Data transfer] Disabling lifecycle hooks');\n\n // Create a connection between the client & the server\n wss.emit('connection', client, ctx.req);\n\n // Invoke the ws callback\n callback(client, request);\n });\n\n ctx.respond = false;\n};\n\n// Protocol related functions\n\nexport const handlerControllerFactory =\n <T extends Partial<Handler>>(implementation: (proto: Handler) => T) =>\n (options: HandlerOptions) => {\n const { verify, server: serverOptions } = options ?? {};\n\n const wss = new WebSocketServer({ ...serverOptions, noServer: true });\n\n return async (ctx: Context) => {\n const cb: WSCallback = (ws) => {\n const state: TransferState = { id: undefined };\n const messageUUIDs = new Set<string>();\n const diagnostics = createDiagnosticReporter();\n\n const cannotRespondHandler = (err: unknown) => {\n strapi?.log?.error(\n '[Data transfer] Cannot send error response to client, closing connection'\n );\n strapi?.log?.error(err);\n try {\n ws.terminate();\n ctx.req.socket.destroy();\n } catch {\n strapi?.log?.error('[Data transfer] Failed to close socket on error');\n }\n };\n\n const prototype: Handler = {\n // Transfer ID\n get transferID() {\n return state.id;\n },\n\n set transferID(id) {\n state.id = id;\n },\n\n // Started at\n get startedAt() {\n return state.startedAt;\n },\n\n set startedAt(timestamp) {\n state.startedAt = timestamp;\n },\n\n get response() {\n return state.response;\n },\n\n set response(response) {\n state.response = response;\n },\n\n get diagnostics() {\n return diagnostics;\n },\n\n addUUID(uuid) {\n messageUUIDs.add(uuid);\n },\n\n hasUUID(uuid) {\n return messageUUIDs.has(uuid);\n },\n\n isTransferStarted() {\n return this.transferID !== undefined && this.startedAt !== undefined;\n },\n\n assertValidTransfer() {\n const isStarted = this.isTransferStarted();\n\n if (!isStarted) {\n throw new Error('Invalid Transfer Process');\n }\n },\n\n assertValidTransferCommand(command: ValidTransferCommand) {\n const isDefined = typeof this[command] === 'function';\n const isValidTransferCommand = VALID_TRANSFER_COMMANDS.includes(command);\n\n if (!isDefined || !isValidTransferCommand) {\n throw new Error('Invalid transfer command');\n }\n },\n\n async respond(uuid, e, data) {\n let details = {};\n return new Promise<void>((resolve, reject) => {\n if (!uuid && !e) {\n reject(new Error('Missing uuid for this message'));\n return;\n }\n\n this.response = {\n uuid,\n data,\n e,\n };\n\n if (e instanceof ProviderError) {\n details = e.details;\n }\n\n const envelope: Record<string, unknown> = {\n uuid,\n data: data ?? null,\n error: e\n ? {\n code: e?.name ?? 'ERR',\n message: e?.message,\n details,\n }\n : null,\n };\n\n const payload = stringifyTransferWebSocketPayload(envelope);\n\n this.send(payload, (error) => (error ? reject(error) : resolve()));\n });\n },\n\n send(message, cb) {\n ws.send(message, cb);\n },\n confirm(message) {\n return new Promise((resolve, reject) => {\n const uuid = randomUUID();\n\n const payload = stringifyTransferWebSocketPayload({ uuid, data: message });\n\n this.send(payload, (error) => {\n if (error) {\n reject(error);\n }\n });\n\n const onResponse = (raw: RawData) => {\n const response = JSON.parse(raw.toString());\n\n if (response.uuid === uuid) {\n resolve(response.data ?? null);\n } else {\n ws.once('message', onResponse);\n }\n };\n\n ws.once('message', onResponse);\n });\n },\n\n async executeAndRespond(uuid, fn) {\n try {\n const response = await fn();\n await this.respond(uuid, null, response);\n } catch (e) {\n if (e instanceof Error) {\n await this.respond(uuid, e).catch(cannotRespondHandler);\n } else if (typeof e === 'string') {\n await this.respond(uuid, new ProviderTransferError(e)).catch(cannotRespondHandler);\n } else {\n await this.respond(\n uuid,\n new ProviderTransferError('Unexpected error', {\n error: e,\n })\n ).catch(cannotRespondHandler);\n }\n }\n },\n\n cleanup() {\n this.transferID = undefined;\n this.startedAt = undefined;\n this.response = undefined;\n },\n\n teardown() {\n this.cleanup();\n },\n\n verifyAuth(scope?: TransferMethod) {\n return verify(ctx, scope);\n },\n\n // Transfer commands\n init() {},\n end() {},\n status() {},\n\n // Default prototype implementation for events\n onMessage() {},\n onError() {},\n onClose() {},\n onInfo() {},\n onWarning() {},\n };\n\n const handler: Handler = Object.assign(Object.create(prototype), implementation(prototype));\n\n // Bind ws events to handler methods\n ws.on('close', async (...args) => {\n try {\n await handler.onClose(...args);\n } catch (err) {\n strapi?.log?.error('[Data transfer] Uncaught error closing connection');\n strapi?.log?.error(err);\n cannotRespondHandler(err);\n } finally {\n resetTimeouts();\n strapi.db.lifecycles.enable();\n strapi.log.info('[Data transfer] Restoring lifecycle hooks');\n }\n });\n ws.on('error', async (...args) => {\n try {\n await handler.onError(...args);\n } catch (err) {\n strapi?.log?.error('[Data transfer] Uncaught error in error handling');\n strapi?.log?.error(err);\n cannotRespondHandler(err);\n }\n });\n ws.on('message', async (...args) => {\n try {\n await handler.onMessage(...args);\n } catch (err) {\n strapi?.log?.error('[Data transfer] Uncaught error in message handling');\n strapi?.log?.error(err);\n cannotRespondHandler(err);\n }\n });\n\n diagnostics.onDiagnostic((diagnostic) => {\n const uuid = randomUUID();\n const payload = JSON.stringify({\n diagnostic,\n uuid,\n });\n\n handler.send(payload);\n });\n };\n\n try {\n handleWSUpgrade(wss, ctx, cb);\n } catch (err) {\n strapi?.log?.error('[Data transfer] Error in websocket upgrade request');\n strapi?.log?.error(err);\n }\n };\n };\n"],"names":["transformUpgradeHeader","header","split","map","s","trim","toLowerCase","timeouts","hasHttpServer","strapi","server","httpServer","disableTimeouts","headersTimeout","requestTimeout","log","info","resetTimeouts","assertValidHeader","ctx","headers","upgrade","upgradeHeader","logSafeUpgradeHeader","JSON","stringify","replace","substring","includes","Error","isDataTransferMessage","message","uuid","type","handleWSUpgrade","wss","callback","handleUpgrade","req","request","socket","Buffer","alloc","client","destroy","db","lifecycles","disable","emit","respond","handlerControllerFactory","implementation","options","verify","serverOptions","WebSocketServer","noServer","cb","ws","state","id","undefined","messageUUIDs","Set","diagnostics","createDiagnosticReporter","cannotRespondHandler","err","error","terminate","prototype","transferID","startedAt","timestamp","response","addUUID","add","hasUUID","has","isTransferStarted","assertValidTransfer","isStarted","assertValidTransferCommand","command","isDefined","isValidTransferCommand","VALID_TRANSFER_COMMANDS","e","data","details","Promise","resolve","reject","ProviderError","envelope","code","name","payload","stringifyTransferWebSocketPayload","send","confirm","randomUUID","onResponse","raw","parse","toString","once","executeAndRespond","fn","catch","ProviderTransferError","cleanup","teardown","verifyAuth","scope","init","end","status","onMessage","onError","onClose","onInfo","onWarning","handler","Object","assign","create","on","args","enable","onDiagnostic","diagnostic"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { randomUUID } from 'crypto';
2
- import { WebSocket } from 'ws';
2
+ import { WebSocketServer } from 'ws';
3
3
  import { ProviderTransferError, ProviderError } from '../../../errors/providers.mjs';
4
4
  import { VALID_TRANSFER_COMMANDS } from './constants.mjs';
5
5
  import { createDiagnosticReporter } from '../../../utils/diagnostic.mjs';
@@ -98,7 +98,7 @@ const isDataTransferMessage = (message)=>{
98
98
  // Protocol related functions
99
99
  const handlerControllerFactory = (implementation)=>(options)=>{
100
100
  const { verify, server: serverOptions } = options ?? {};
101
- const wss = new WebSocket.Server({
101
+ const wss = new WebSocketServer({
102
102
  ...serverOptions,
103
103
  noServer: true
104
104
  });
@@ -1 +1 @@
1
- {"version":3,"file":"utils.mjs","sources":["../../../../src/strapi/remote/handlers/utils.ts"],"sourcesContent":["import type { IncomingMessage } from 'node:http';\nimport { randomUUID } from 'crypto';\nimport type { Context } from 'koa';\nimport type { RawData, ServerOptions } from 'ws';\nimport { WebSocket, WebSocketServer } from 'ws';\n\nimport type { Handler, TransferState } from './abstract';\nimport type { Protocol } from '../../../types';\nimport { ProviderError, ProviderTransferError } from '../../../errors/providers';\nimport { VALID_TRANSFER_COMMANDS, ValidTransferCommand } from './constants';\nimport { TransferMethod } from '../constants';\nimport { createDiagnosticReporter } from '../../../utils/diagnostic';\nimport { stringifyTransferWebSocketPayload } from '../../../utils/transfer-websocket-json';\n\ntype WSCallback = (client: WebSocket, request: IncomingMessage) => void;\n\nexport interface HandlerOptions {\n verify: (ctx: Context, scope?: TransferMethod) => Promise<void>;\n server?: ServerOptions;\n}\n\nexport const transformUpgradeHeader = (header = '') => {\n return header.split(',').map((s) => s.trim().toLowerCase());\n};\n\nlet timeouts: Record<string, number> | undefined;\n\nconst hasHttpServer = () => {\n // during server restarts, strapi may not have ever been defined at all, so we have to check it first\n return typeof strapi !== 'undefined' && !!strapi?.server?.httpServer;\n};\n\n// temporarily disable server timeouts while transfer is running\nconst disableTimeouts = () => {\n if (!hasHttpServer()) {\n return;\n }\n\n const { httpServer } = strapi.server;\n\n // save the original timeouts to restore after\n if (!timeouts) {\n timeouts = {\n headersTimeout: httpServer.headersTimeout,\n requestTimeout: httpServer.requestTimeout,\n };\n }\n\n httpServer.headersTimeout = 0;\n httpServer.requestTimeout = 0;\n\n strapi.log.info('[Data transfer] Disabling http timeouts');\n};\nconst resetTimeouts = () => {\n if (!hasHttpServer() || !timeouts) {\n return;\n }\n\n const { httpServer } = strapi.server;\n\n strapi.log.info('[Data transfer] Restoring http timeouts');\n httpServer.headersTimeout = timeouts.headersTimeout;\n httpServer.requestTimeout = timeouts.requestTimeout;\n};\n/**\n * Make sure that the upgrade header is a valid websocket one\n */\nexport const assertValidHeader = (ctx: Context) => {\n // if it's exactly what we expect, it's fine\n if (ctx.headers.upgrade === 'websocket') {\n return;\n }\n\n // check if it could be an array that still includes websocket\n const upgradeHeader = transformUpgradeHeader(ctx.headers.upgrade);\n\n // Sanitize user input before writing it to our logs\n const logSafeUpgradeHeader = JSON.stringify(ctx.headers.upgrade)\n ?.replace(/[^a-z0-9\\s.,|]/gi, '')\n .substring(0, 50);\n\n if (!upgradeHeader.includes('websocket')) {\n throw new Error(\n `Transfer Upgrade header expected 'websocket', found '${logSafeUpgradeHeader}'. Please ensure that your server or proxy is not modifying the Upgrade header.`\n );\n }\n\n /**\n * If there's more than expected but it still includes websocket, in theory it could still work\n * and could be necessary for their certain configurations, so we'll allow it to proceed but\n * log the unexpected behaviour in case it helps debug an issue\n * */\n strapi.log.info(\n `Transfer Upgrade header expected only 'websocket', found unexpected values: ${logSafeUpgradeHeader}`\n );\n};\n\nexport const isDataTransferMessage = (message: unknown): message is Protocol.Client.Message => {\n if (!message || typeof message !== 'object') {\n return false;\n }\n\n const { uuid, type } = message as Record<string, unknown>;\n\n if (typeof uuid !== 'string' || typeof type !== 'string') {\n return false;\n }\n\n if (!['command', 'transfer'].includes(type)) {\n return false;\n }\n\n return true;\n};\n\n/**\n * Handle the upgrade to ws connection\n */\nexport const handleWSUpgrade = (wss: WebSocketServer, ctx: Context, callback: WSCallback) => {\n assertValidHeader(ctx);\n\n wss.handleUpgrade(ctx.req, ctx.request.socket, Buffer.alloc(0), (client, request) => {\n if (!client) {\n // If the WebSocket upgrade failed, destroy the socket to avoid hanging\n ctx.request.socket.destroy();\n return;\n }\n\n disableTimeouts();\n strapi.db.lifecycles.disable();\n strapi.log.info('[Data transfer] Disabling lifecycle hooks');\n\n // Create a connection between the client & the server\n wss.emit('connection', client, ctx.req);\n\n // Invoke the ws callback\n callback(client, request);\n });\n\n ctx.respond = false;\n};\n\n// Protocol related functions\n\nexport const handlerControllerFactory =\n <T extends Partial<Handler>>(implementation: (proto: Handler) => T) =>\n (options: HandlerOptions) => {\n const { verify, server: serverOptions } = options ?? {};\n\n const wss = new WebSocket.Server({ ...serverOptions, noServer: true });\n\n return async (ctx: Context) => {\n const cb: WSCallback = (ws) => {\n const state: TransferState = { id: undefined };\n const messageUUIDs = new Set<string>();\n const diagnostics = createDiagnosticReporter();\n\n const cannotRespondHandler = (err: unknown) => {\n strapi?.log?.error(\n '[Data transfer] Cannot send error response to client, closing connection'\n );\n strapi?.log?.error(err);\n try {\n ws.terminate();\n ctx.req.socket.destroy();\n } catch {\n strapi?.log?.error('[Data transfer] Failed to close socket on error');\n }\n };\n\n const prototype: Handler = {\n // Transfer ID\n get transferID() {\n return state.id;\n },\n\n set transferID(id) {\n state.id = id;\n },\n\n // Started at\n get startedAt() {\n return state.startedAt;\n },\n\n set startedAt(timestamp) {\n state.startedAt = timestamp;\n },\n\n get response() {\n return state.response;\n },\n\n set response(response) {\n state.response = response;\n },\n\n get diagnostics() {\n return diagnostics;\n },\n\n addUUID(uuid) {\n messageUUIDs.add(uuid);\n },\n\n hasUUID(uuid) {\n return messageUUIDs.has(uuid);\n },\n\n isTransferStarted() {\n return this.transferID !== undefined && this.startedAt !== undefined;\n },\n\n assertValidTransfer() {\n const isStarted = this.isTransferStarted();\n\n if (!isStarted) {\n throw new Error('Invalid Transfer Process');\n }\n },\n\n assertValidTransferCommand(command: ValidTransferCommand) {\n const isDefined = typeof this[command] === 'function';\n const isValidTransferCommand = VALID_TRANSFER_COMMANDS.includes(command);\n\n if (!isDefined || !isValidTransferCommand) {\n throw new Error('Invalid transfer command');\n }\n },\n\n async respond(uuid, e, data) {\n let details = {};\n return new Promise<void>((resolve, reject) => {\n if (!uuid && !e) {\n reject(new Error('Missing uuid for this message'));\n return;\n }\n\n this.response = {\n uuid,\n data,\n e,\n };\n\n if (e instanceof ProviderError) {\n details = e.details;\n }\n\n const envelope: Record<string, unknown> = {\n uuid,\n data: data ?? null,\n error: e\n ? {\n code: e?.name ?? 'ERR',\n message: e?.message,\n details,\n }\n : null,\n };\n\n const payload = stringifyTransferWebSocketPayload(envelope);\n\n this.send(payload, (error) => (error ? reject(error) : resolve()));\n });\n },\n\n send(message, cb) {\n ws.send(message, cb);\n },\n confirm(message) {\n return new Promise((resolve, reject) => {\n const uuid = randomUUID();\n\n const payload = stringifyTransferWebSocketPayload({ uuid, data: message });\n\n this.send(payload, (error) => {\n if (error) {\n reject(error);\n }\n });\n\n const onResponse = (raw: RawData) => {\n const response = JSON.parse(raw.toString());\n\n if (response.uuid === uuid) {\n resolve(response.data ?? null);\n } else {\n ws.once('message', onResponse);\n }\n };\n\n ws.once('message', onResponse);\n });\n },\n\n async executeAndRespond(uuid, fn) {\n try {\n const response = await fn();\n await this.respond(uuid, null, response);\n } catch (e) {\n if (e instanceof Error) {\n await this.respond(uuid, e).catch(cannotRespondHandler);\n } else if (typeof e === 'string') {\n await this.respond(uuid, new ProviderTransferError(e)).catch(cannotRespondHandler);\n } else {\n await this.respond(\n uuid,\n new ProviderTransferError('Unexpected error', {\n error: e,\n })\n ).catch(cannotRespondHandler);\n }\n }\n },\n\n cleanup() {\n this.transferID = undefined;\n this.startedAt = undefined;\n this.response = undefined;\n },\n\n teardown() {\n this.cleanup();\n },\n\n verifyAuth(scope?: TransferMethod) {\n return verify(ctx, scope);\n },\n\n // Transfer commands\n init() {},\n end() {},\n status() {},\n\n // Default prototype implementation for events\n onMessage() {},\n onError() {},\n onClose() {},\n onInfo() {},\n onWarning() {},\n };\n\n const handler: Handler = Object.assign(Object.create(prototype), implementation(prototype));\n\n // Bind ws events to handler methods\n ws.on('close', async (...args) => {\n try {\n await handler.onClose(...args);\n } catch (err) {\n strapi?.log?.error('[Data transfer] Uncaught error closing connection');\n strapi?.log?.error(err);\n cannotRespondHandler(err);\n } finally {\n resetTimeouts();\n strapi.db.lifecycles.enable();\n strapi.log.info('[Data transfer] Restoring lifecycle hooks');\n }\n });\n ws.on('error', async (...args) => {\n try {\n await handler.onError(...args);\n } catch (err) {\n strapi?.log?.error('[Data transfer] Uncaught error in error handling');\n strapi?.log?.error(err);\n cannotRespondHandler(err);\n }\n });\n ws.on('message', async (...args) => {\n try {\n await handler.onMessage(...args);\n } catch (err) {\n strapi?.log?.error('[Data transfer] Uncaught error in message handling');\n strapi?.log?.error(err);\n cannotRespondHandler(err);\n }\n });\n\n diagnostics.onDiagnostic((diagnostic) => {\n const uuid = randomUUID();\n const payload = JSON.stringify({\n diagnostic,\n uuid,\n });\n\n handler.send(payload);\n });\n };\n\n try {\n handleWSUpgrade(wss, ctx, cb);\n } catch (err) {\n strapi?.log?.error('[Data transfer] Error in websocket upgrade request');\n strapi?.log?.error(err);\n }\n };\n };\n"],"names":["transformUpgradeHeader","header","split","map","s","trim","toLowerCase","timeouts","hasHttpServer","strapi","server","httpServer","disableTimeouts","headersTimeout","requestTimeout","log","info","resetTimeouts","assertValidHeader","ctx","headers","upgrade","upgradeHeader","logSafeUpgradeHeader","JSON","stringify","replace","substring","includes","Error","isDataTransferMessage","message","uuid","type","handleWSUpgrade","wss","callback","handleUpgrade","req","request","socket","Buffer","alloc","client","destroy","db","lifecycles","disable","emit","respond","handlerControllerFactory","implementation","options","verify","serverOptions","WebSocket","Server","noServer","cb","ws","state","id","undefined","messageUUIDs","Set","diagnostics","createDiagnosticReporter","cannotRespondHandler","err","error","terminate","prototype","transferID","startedAt","timestamp","response","addUUID","add","hasUUID","has","isTransferStarted","assertValidTransfer","isStarted","assertValidTransferCommand","command","isDefined","isValidTransferCommand","VALID_TRANSFER_COMMANDS","e","data","details","Promise","resolve","reject","ProviderError","envelope","code","name","payload","stringifyTransferWebSocketPayload","send","confirm","randomUUID","onResponse","raw","parse","toString","once","executeAndRespond","fn","catch","ProviderTransferError","cleanup","teardown","verifyAuth","scope","init","end","status","onMessage","onError","onClose","onInfo","onWarning","handler","Object","assign","create","on","args","enable","onDiagnostic","diagnostic"],"mappings":"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"}
1
+ {"version":3,"file":"utils.mjs","sources":["../../../../src/strapi/remote/handlers/utils.ts"],"sourcesContent":["import type { IncomingMessage } from 'node:http';\nimport { randomUUID } from 'crypto';\nimport type { Context } from 'koa';\nimport type { RawData, ServerOptions } from 'ws';\nimport { WebSocket, WebSocketServer } from 'ws';\n\nimport type { Handler, TransferState } from './abstract';\nimport type { Protocol } from '../../../types';\nimport { ProviderError, ProviderTransferError } from '../../../errors/providers';\nimport { VALID_TRANSFER_COMMANDS, ValidTransferCommand } from './constants';\nimport { TransferMethod } from '../constants';\nimport { createDiagnosticReporter } from '../../../utils/diagnostic';\nimport { stringifyTransferWebSocketPayload } from '../../../utils/transfer-websocket-json';\n\ntype WSCallback = (client: WebSocket, request: IncomingMessage) => void;\n\nexport interface HandlerOptions {\n verify: (ctx: Context, scope?: TransferMethod) => Promise<void>;\n server?: ServerOptions;\n}\n\nexport const transformUpgradeHeader = (header = '') => {\n return header.split(',').map((s) => s.trim().toLowerCase());\n};\n\nlet timeouts: Record<string, number> | undefined;\n\nconst hasHttpServer = () => {\n // during server restarts, strapi may not have ever been defined at all, so we have to check it first\n return typeof strapi !== 'undefined' && !!strapi?.server?.httpServer;\n};\n\n// temporarily disable server timeouts while transfer is running\nconst disableTimeouts = () => {\n if (!hasHttpServer()) {\n return;\n }\n\n const { httpServer } = strapi.server;\n\n // save the original timeouts to restore after\n if (!timeouts) {\n timeouts = {\n headersTimeout: httpServer.headersTimeout,\n requestTimeout: httpServer.requestTimeout,\n };\n }\n\n httpServer.headersTimeout = 0;\n httpServer.requestTimeout = 0;\n\n strapi.log.info('[Data transfer] Disabling http timeouts');\n};\nconst resetTimeouts = () => {\n if (!hasHttpServer() || !timeouts) {\n return;\n }\n\n const { httpServer } = strapi.server;\n\n strapi.log.info('[Data transfer] Restoring http timeouts');\n httpServer.headersTimeout = timeouts.headersTimeout;\n httpServer.requestTimeout = timeouts.requestTimeout;\n};\n/**\n * Make sure that the upgrade header is a valid websocket one\n */\nexport const assertValidHeader = (ctx: Context) => {\n // if it's exactly what we expect, it's fine\n if (ctx.headers.upgrade === 'websocket') {\n return;\n }\n\n // check if it could be an array that still includes websocket\n const upgradeHeader = transformUpgradeHeader(ctx.headers.upgrade);\n\n // Sanitize user input before writing it to our logs\n const logSafeUpgradeHeader = JSON.stringify(ctx.headers.upgrade)\n ?.replace(/[^a-z0-9\\s.,|]/gi, '')\n .substring(0, 50);\n\n if (!upgradeHeader.includes('websocket')) {\n throw new Error(\n `Transfer Upgrade header expected 'websocket', found '${logSafeUpgradeHeader}'. Please ensure that your server or proxy is not modifying the Upgrade header.`\n );\n }\n\n /**\n * If there's more than expected but it still includes websocket, in theory it could still work\n * and could be necessary for their certain configurations, so we'll allow it to proceed but\n * log the unexpected behaviour in case it helps debug an issue\n * */\n strapi.log.info(\n `Transfer Upgrade header expected only 'websocket', found unexpected values: ${logSafeUpgradeHeader}`\n );\n};\n\nexport const isDataTransferMessage = (message: unknown): message is Protocol.Client.Message => {\n if (!message || typeof message !== 'object') {\n return false;\n }\n\n const { uuid, type } = message as Record<string, unknown>;\n\n if (typeof uuid !== 'string' || typeof type !== 'string') {\n return false;\n }\n\n if (!['command', 'transfer'].includes(type)) {\n return false;\n }\n\n return true;\n};\n\n/**\n * Handle the upgrade to ws connection\n */\nexport const handleWSUpgrade = (wss: WebSocketServer, ctx: Context, callback: WSCallback) => {\n assertValidHeader(ctx);\n\n wss.handleUpgrade(ctx.req, ctx.request.socket, Buffer.alloc(0), (client, request) => {\n if (!client) {\n // If the WebSocket upgrade failed, destroy the socket to avoid hanging\n ctx.request.socket.destroy();\n return;\n }\n\n disableTimeouts();\n strapi.db.lifecycles.disable();\n strapi.log.info('[Data transfer] Disabling lifecycle hooks');\n\n // Create a connection between the client & the server\n wss.emit('connection', client, ctx.req);\n\n // Invoke the ws callback\n callback(client, request);\n });\n\n ctx.respond = false;\n};\n\n// Protocol related functions\n\nexport const handlerControllerFactory =\n <T extends Partial<Handler>>(implementation: (proto: Handler) => T) =>\n (options: HandlerOptions) => {\n const { verify, server: serverOptions } = options ?? {};\n\n const wss = new WebSocketServer({ ...serverOptions, noServer: true });\n\n return async (ctx: Context) => {\n const cb: WSCallback = (ws) => {\n const state: TransferState = { id: undefined };\n const messageUUIDs = new Set<string>();\n const diagnostics = createDiagnosticReporter();\n\n const cannotRespondHandler = (err: unknown) => {\n strapi?.log?.error(\n '[Data transfer] Cannot send error response to client, closing connection'\n );\n strapi?.log?.error(err);\n try {\n ws.terminate();\n ctx.req.socket.destroy();\n } catch {\n strapi?.log?.error('[Data transfer] Failed to close socket on error');\n }\n };\n\n const prototype: Handler = {\n // Transfer ID\n get transferID() {\n return state.id;\n },\n\n set transferID(id) {\n state.id = id;\n },\n\n // Started at\n get startedAt() {\n return state.startedAt;\n },\n\n set startedAt(timestamp) {\n state.startedAt = timestamp;\n },\n\n get response() {\n return state.response;\n },\n\n set response(response) {\n state.response = response;\n },\n\n get diagnostics() {\n return diagnostics;\n },\n\n addUUID(uuid) {\n messageUUIDs.add(uuid);\n },\n\n hasUUID(uuid) {\n return messageUUIDs.has(uuid);\n },\n\n isTransferStarted() {\n return this.transferID !== undefined && this.startedAt !== undefined;\n },\n\n assertValidTransfer() {\n const isStarted = this.isTransferStarted();\n\n if (!isStarted) {\n throw new Error('Invalid Transfer Process');\n }\n },\n\n assertValidTransferCommand(command: ValidTransferCommand) {\n const isDefined = typeof this[command] === 'function';\n const isValidTransferCommand = VALID_TRANSFER_COMMANDS.includes(command);\n\n if (!isDefined || !isValidTransferCommand) {\n throw new Error('Invalid transfer command');\n }\n },\n\n async respond(uuid, e, data) {\n let details = {};\n return new Promise<void>((resolve, reject) => {\n if (!uuid && !e) {\n reject(new Error('Missing uuid for this message'));\n return;\n }\n\n this.response = {\n uuid,\n data,\n e,\n };\n\n if (e instanceof ProviderError) {\n details = e.details;\n }\n\n const envelope: Record<string, unknown> = {\n uuid,\n data: data ?? null,\n error: e\n ? {\n code: e?.name ?? 'ERR',\n message: e?.message,\n details,\n }\n : null,\n };\n\n const payload = stringifyTransferWebSocketPayload(envelope);\n\n this.send(payload, (error) => (error ? reject(error) : resolve()));\n });\n },\n\n send(message, cb) {\n ws.send(message, cb);\n },\n confirm(message) {\n return new Promise((resolve, reject) => {\n const uuid = randomUUID();\n\n const payload = stringifyTransferWebSocketPayload({ uuid, data: message });\n\n this.send(payload, (error) => {\n if (error) {\n reject(error);\n }\n });\n\n const onResponse = (raw: RawData) => {\n const response = JSON.parse(raw.toString());\n\n if (response.uuid === uuid) {\n resolve(response.data ?? null);\n } else {\n ws.once('message', onResponse);\n }\n };\n\n ws.once('message', onResponse);\n });\n },\n\n async executeAndRespond(uuid, fn) {\n try {\n const response = await fn();\n await this.respond(uuid, null, response);\n } catch (e) {\n if (e instanceof Error) {\n await this.respond(uuid, e).catch(cannotRespondHandler);\n } else if (typeof e === 'string') {\n await this.respond(uuid, new ProviderTransferError(e)).catch(cannotRespondHandler);\n } else {\n await this.respond(\n uuid,\n new ProviderTransferError('Unexpected error', {\n error: e,\n })\n ).catch(cannotRespondHandler);\n }\n }\n },\n\n cleanup() {\n this.transferID = undefined;\n this.startedAt = undefined;\n this.response = undefined;\n },\n\n teardown() {\n this.cleanup();\n },\n\n verifyAuth(scope?: TransferMethod) {\n return verify(ctx, scope);\n },\n\n // Transfer commands\n init() {},\n end() {},\n status() {},\n\n // Default prototype implementation for events\n onMessage() {},\n onError() {},\n onClose() {},\n onInfo() {},\n onWarning() {},\n };\n\n const handler: Handler = Object.assign(Object.create(prototype), implementation(prototype));\n\n // Bind ws events to handler methods\n ws.on('close', async (...args) => {\n try {\n await handler.onClose(...args);\n } catch (err) {\n strapi?.log?.error('[Data transfer] Uncaught error closing connection');\n strapi?.log?.error(err);\n cannotRespondHandler(err);\n } finally {\n resetTimeouts();\n strapi.db.lifecycles.enable();\n strapi.log.info('[Data transfer] Restoring lifecycle hooks');\n }\n });\n ws.on('error', async (...args) => {\n try {\n await handler.onError(...args);\n } catch (err) {\n strapi?.log?.error('[Data transfer] Uncaught error in error handling');\n strapi?.log?.error(err);\n cannotRespondHandler(err);\n }\n });\n ws.on('message', async (...args) => {\n try {\n await handler.onMessage(...args);\n } catch (err) {\n strapi?.log?.error('[Data transfer] Uncaught error in message handling');\n strapi?.log?.error(err);\n cannotRespondHandler(err);\n }\n });\n\n diagnostics.onDiagnostic((diagnostic) => {\n const uuid = randomUUID();\n const payload = JSON.stringify({\n diagnostic,\n uuid,\n });\n\n handler.send(payload);\n });\n };\n\n try {\n handleWSUpgrade(wss, ctx, cb);\n } catch (err) {\n strapi?.log?.error('[Data transfer] Error in websocket upgrade request');\n strapi?.log?.error(err);\n }\n };\n };\n"],"names":["transformUpgradeHeader","header","split","map","s","trim","toLowerCase","timeouts","hasHttpServer","strapi","server","httpServer","disableTimeouts","headersTimeout","requestTimeout","log","info","resetTimeouts","assertValidHeader","ctx","headers","upgrade","upgradeHeader","logSafeUpgradeHeader","JSON","stringify","replace","substring","includes","Error","isDataTransferMessage","message","uuid","type","handleWSUpgrade","wss","callback","handleUpgrade","req","request","socket","Buffer","alloc","client","destroy","db","lifecycles","disable","emit","respond","handlerControllerFactory","implementation","options","verify","serverOptions","WebSocketServer","noServer","cb","ws","state","id","undefined","messageUUIDs","Set","diagnostics","createDiagnosticReporter","cannotRespondHandler","err","error","terminate","prototype","transferID","startedAt","timestamp","response","addUUID","add","hasUUID","has","isTransferStarted","assertValidTransfer","isStarted","assertValidTransferCommand","command","isDefined","isValidTransferCommand","VALID_TRANSFER_COMMANDS","e","data","details","Promise","resolve","reject","ProviderError","envelope","code","name","payload","stringifyTransferWebSocketPayload","send","confirm","randomUUID","onResponse","raw","parse","toString","once","executeAndRespond","fn","catch","ProviderTransferError","cleanup","teardown","verifyAuth","scope","init","end","status","onMessage","onError","onClose","onInfo","onWarning","handler","Object","assign","create","on","args","enable","onDiagnostic","diagnostic"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/types/remote/protocol/client/transfer/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,QAAQ,CAAC;AAElD,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC;AAExB,MAAM,MAAM,eAAe,GAAG;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG,CACrE,MAAM,GACN,mBAAmB,GACnB,mBAAmB,CACtB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/types/remote/protocol/client/transfer/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,QAAQ,CAAC;AAElD,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC;AAExB,MAAM,MAAM,eAAe,GAAG;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG,CACvE,MAAM,GAAG,mBAAmB,GAAG,mBAAmB,CACnD,CAAC"}