UNPKG

@strapi/data-transfer

Version:

Data transfer capabilities for Strapi

1 lines 5.25 kB
{"version":3,"file":"transfer-websocket-json.mjs","sources":["../../src/utils/transfer-websocket-json.ts"],"sourcesContent":["/**\n * Shared `JSON.stringify` replacer for data-transfer WebSocket frames (push and pull).\n *\n * Default `JSON.stringify` uses `Buffer.toJSON()` → `{ type: 'Buffer', data: [n,n,...] }`, which\n * allocates a large array on the peer during `JSON.parse`. Encode binary values as compact base64 strings instead.\n *\n * Note: Node runs `Buffer.prototype.toJSON` before the replacer sees a `Buffer` property, so the\n * replacer receives `{ type: 'Buffer', data: [...] }` unless the value is already a string (see\n * `createTransferAssetStreamChunk` in `transfer-asset-chunk.ts`).\n */\nexport const replacerForTransferWebSocket = (_key: string, value: unknown): unknown => {\n /** `JSON.stringify` throws on bigint; upload metadata or ORM fields may surface as BigInt. */\n if (typeof value === 'bigint') {\n return value.toString();\n }\n if (Buffer.isBuffer(value)) {\n return value.toString('base64');\n }\n if (value instanceof Uint8Array) {\n const { buffer, byteOffset, byteLength } = value;\n if (buffer == null) {\n throw new TypeError(\n 'Invalid Uint8Array in transfer payload (missing underlying ArrayBuffer); cannot encode for WebSocket'\n );\n }\n return Buffer.from(buffer, byteOffset, byteLength).toString('base64');\n }\n if (ArrayBuffer.isView(value) && !(value instanceof DataView)) {\n const v = value as NodeJS.TypedArray;\n const { buffer, byteOffset, byteLength } = v;\n if (buffer == null) {\n throw new TypeError(\n 'Invalid typed array in transfer payload (missing underlying ArrayBuffer); cannot encode for WebSocket'\n );\n }\n return Buffer.from(buffer, byteOffset, byteLength).toString('base64');\n }\n return value;\n};\n\n/**\n * `JSON.stringify` invokes an own enumerable `toJSON` on the root value before replacers run. If that\n * method returns `undefined`, the whole `JSON.stringify` result is `undefined`, and `ws.send(undefined)`\n * throws (\"The first argument must be of type string or an instance of Buffer... Received undefined\").\n * Spreading transfer messages (`{ ...message, uuid }`) can copy an enumerable `toJSON` from user / ORM\n * objects onto the wire payload — strip it on the root object we control.\n */\nexport function stripRootToJSONMethod(payload: Record<string, unknown>): void {\n if (typeof payload.toJSON === 'function') {\n delete payload.toJSON;\n }\n}\n\n/**\n * Serialize a transfer WebSocket envelope. Never returns `undefined` (unlike raw `JSON.stringify`).\n */\nexport function stringifyTransferWebSocketPayload(payload: Record<string, unknown>): string {\n stripRootToJSONMethod(payload);\n let s: string | undefined;\n try {\n s = JSON.stringify(payload, replacerForTransferWebSocket);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n throw new TypeError(`Transfer WebSocket payload could not be serialized to JSON: ${message}`);\n }\n if (typeof s !== 'string') {\n throw new TypeError(\n 'Transfer WebSocket payload could not be serialized to JSON (result was undefined). Check for Symbol or other non-JSON values on the root payload.'\n );\n }\n return s;\n}\n"],"names":["replacerForTransferWebSocket","_key","value","toString","Buffer","isBuffer","Uint8Array","buffer","byteOffset","byteLength","TypeError","from","ArrayBuffer","isView","DataView","v","stripRootToJSONMethod","payload","toJSON","stringifyTransferWebSocketPayload","s","JSON","stringify","err","message","Error","String"],"mappings":"AAAA;;;;;;;;;AASC,IACM,MAAMA,4BAAAA,GAA+B,CAACC,IAAAA,EAAcC,KAAAA,GAAAA;AACzD,mGACA,IAAI,OAAOA,KAAAA,KAAU,QAAA,EAAU;AAC7B,QAAA,OAAOA,MAAMC,QAAQ,EAAA;AACvB,IAAA;IACA,IAAIC,MAAAA,CAAOC,QAAQ,CAACH,KAAAA,CAAAA,EAAQ;QAC1B,OAAOA,KAAAA,CAAMC,QAAQ,CAAC,QAAA,CAAA;AACxB,IAAA;AACA,IAAA,IAAID,iBAAiBI,UAAAA,EAAY;AAC/B,QAAA,MAAM,EAAEC,MAAM,EAAEC,UAAU,EAAEC,UAAU,EAAE,GAAGP,KAAAA;AAC3C,QAAA,IAAIK,UAAU,IAAA,EAAM;AAClB,YAAA,MAAM,IAAIG,SAAAA,CACR,sGAAA,CAAA;AAEJ,QAAA;AACA,QAAA,OAAON,OAAOO,IAAI,CAACJ,QAAQC,UAAAA,EAAYC,UAAAA,CAAAA,CAAYN,QAAQ,CAAC,QAAA,CAAA;AAC9D,IAAA;IACA,IAAIS,WAAAA,CAAYC,MAAM,CAACX,KAAAA,CAAAA,IAAU,EAAEA,KAAAA,YAAiBY,QAAO,CAAA,EAAI;AAC7D,QAAA,MAAMC,CAAAA,GAAIb,KAAAA;AACV,QAAA,MAAM,EAAEK,MAAM,EAAEC,UAAU,EAAEC,UAAU,EAAE,GAAGM,CAAAA;AAC3C,QAAA,IAAIR,UAAU,IAAA,EAAM;AAClB,YAAA,MAAM,IAAIG,SAAAA,CACR,uGAAA,CAAA;AAEJ,QAAA;AACA,QAAA,OAAON,OAAOO,IAAI,CAACJ,QAAQC,UAAAA,EAAYC,UAAAA,CAAAA,CAAYN,QAAQ,CAAC,QAAA,CAAA;AAC9D,IAAA;IACA,OAAOD,KAAAA;AACT;AAEA;;;;;;IAOO,SAASc,qBAAAA,CAAsBC,OAAgC,EAAA;AACpE,IAAA,IAAI,OAAOA,OAAAA,CAAQC,MAAM,KAAK,UAAA,EAAY;AACxC,QAAA,OAAOD,QAAQC,MAAM;AACvB,IAAA;AACF;AAEA;;IAGO,SAASC,iCAAAA,CAAkCF,OAAgC,EAAA;IAChFD,qBAAAA,CAAsBC,OAAAA,CAAAA;IACtB,IAAIG,CAAAA;IACJ,IAAI;QACFA,CAAAA,GAAIC,IAAAA,CAAKC,SAAS,CAACL,OAAAA,EAASjB,4BAAAA,CAAAA;AAC9B,IAAA,CAAA,CAAE,OAAOuB,GAAAA,EAAK;AACZ,QAAA,MAAMC,UAAUD,GAAAA,YAAeE,KAAAA,GAAQF,GAAAA,CAAIC,OAAO,GAAGE,MAAAA,CAAOH,GAAAA,CAAAA;AAC5D,QAAA,MAAM,IAAIb,SAAAA,CAAU,CAAC,4DAA4D,EAAEc,OAAAA,CAAAA,CAAS,CAAA;AAC9F,IAAA;IACA,IAAI,OAAOJ,MAAM,QAAA,EAAU;AACzB,QAAA,MAAM,IAAIV,SAAAA,CACR,mJAAA,CAAA;AAEJ,IAAA;IACA,OAAOU,CAAAA;AACT;;;;"}