@strapi/data-transfer
Version:
Data transfer capabilities for Strapi
1 lines • 6.55 kB
Source Map (JSON)
{"version":3,"file":"transfer-asset-chunk.mjs","sources":["../../src/utils/transfer-asset-chunk.ts"],"sourcesContent":["/**\n * Canonical **outbound** asset chunk for WebSocket JSON (push and pull).\n * Base64 string `data` keeps `JSON.parse` heap bounded vs `{ type: 'Buffer', data: [n,…] }`.\n */\nexport function createTransferAssetStreamChunk(\n assetID: string,\n chunk: Buffer | Uint8Array\n): { action: 'stream'; assetID: string; encoding: 'base64'; data: string } {\n if (chunk == null) {\n throw new TypeError(\n 'Asset stream yielded a null/undefined chunk; refusing to encode (would trigger Buffer.from(undefined))'\n );\n }\n const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);\n return {\n action: 'stream',\n assetID,\n encoding: 'base64',\n data: buffer.toString('base64'),\n };\n}\n\n/**\n * Decode a stream item from `TransferAssetFlow` after `JSON.parse` (shared by push + pull handlers\n * and the remote source provider).\n */\nexport function decodeTransferAssetStreamItem(item: {\n action: 'stream';\n data: unknown;\n encoding?: 'base64';\n}): Buffer {\n return decodeTransferAssetStreamData(\n item.data,\n item.encoding === 'base64' ? 'base64' : undefined\n );\n}\n\nconst getLegacyBufferJsonData = (value: unknown): Uint8Array | readonly number[] | null => {\n if (!value || typeof value !== 'object' || !('type' in value)) {\n return null;\n }\n if ((value as { type: unknown }).type !== 'Buffer') {\n return null;\n }\n const raw = (value as { data?: unknown }).data;\n if (Array.isArray(raw) || ArrayBuffer.isView(raw)) {\n return raw as Uint8Array | readonly number[];\n }\n return null;\n};\n\n/**\n * Decode binary payload for `TransferAssetFlow` `action: 'stream'` after JSON.parse.\n *\n * Supported shapes (receivers should accept all of these):\n * - **String `data`:** preferred wire form (`createTransferAssetStreamChunk` / `encoding: 'base64'`).\n * - **`{ type: 'Buffer', data: number[] | TypedArray }`:** legacy `Buffer.toJSON()` from default\n * `JSON.stringify` (older clients/servers).\n * - **`Buffer` instance:** in-process only.\n *\n * Note: Node’s `JSON.stringify` runs `Buffer.toJSON()` before any replacer, so nested `Buffer`\n * values become the legacy object unless you pass a string (use `createTransferAssetStreamChunk`).\n */\nexport function decodeTransferAssetStreamData(data: unknown, encoding?: 'base64'): Buffer {\n if (encoding === 'base64' && typeof data === 'string') {\n return Buffer.from(data, 'base64');\n }\n // `encoding: 'base64'` with a non-string payload (or no encoding) uses the same fallbacks as\n // legacy peers — avoids throwing when flags and payload disagree.\n\n if (Buffer.isBuffer(data)) {\n return Buffer.from(data);\n }\n\n const legacyBufferData = getLegacyBufferJsonData(data);\n if (legacyBufferData) {\n return Buffer.from(legacyBufferData);\n }\n\n // Wire base64 string (pull generator and any other path that stringifies a string payload).\n if (typeof data === 'string') {\n return Buffer.from(data, 'base64');\n }\n\n throw new TypeError('Invalid transfer asset stream chunk payload');\n}\n\n/** Approximate decoded byte size for batching (pull asset generator). */\nexport function transferAssetStreamChunkByteLength(chunk: {\n action: string;\n data?: unknown;\n encoding?: 'base64';\n}): number {\n if (chunk.action !== 'stream') {\n return 0;\n }\n if (typeof chunk.data === 'string') {\n return Math.floor((chunk.data.length * 3) / 4);\n }\n if (Buffer.isBuffer(chunk.data)) {\n return chunk.data.byteLength;\n }\n\n const legacyBufferData = getLegacyBufferJsonData(chunk.data);\n if (legacyBufferData) {\n if (Array.isArray(legacyBufferData)) {\n return legacyBufferData.length;\n }\n if (ArrayBuffer.isView(legacyBufferData)) {\n return legacyBufferData.byteLength;\n }\n }\n return 0;\n}\n"],"names":["createTransferAssetStreamChunk","assetID","chunk","TypeError","buffer","Buffer","isBuffer","from","action","encoding","data","toString","decodeTransferAssetStreamItem","item","decodeTransferAssetStreamData","undefined","getLegacyBufferJsonData","value","type","raw","Array","isArray","ArrayBuffer","isView","legacyBufferData","transferAssetStreamChunkByteLength","Math","floor","length","byteLength"],"mappings":"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"}