@strapi/data-transfer 5.48.0 → 5.48.1

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 (190) hide show
  1. package/dist/directory/providers/destination/index.d.ts +1 -1
  2. package/dist/directory/providers/destination/index.d.ts.map +1 -1
  3. package/dist/directory/providers/destination/index.js.map +1 -1
  4. package/dist/directory/providers/destination/index.mjs.map +1 -1
  5. package/dist/directory/providers/source/index.d.ts +1 -1
  6. package/dist/directory/providers/source/index.d.ts.map +1 -1
  7. package/dist/directory/providers/source/index.js.map +1 -1
  8. package/dist/directory/providers/source/index.mjs.map +1 -1
  9. package/dist/engine/index.d.ts +1 -1
  10. package/dist/engine/index.d.ts.map +1 -1
  11. package/dist/engine/index.js.map +1 -1
  12. package/dist/engine/index.mjs.map +1 -1
  13. package/dist/engine/validation/provider.d.ts +1 -1
  14. package/dist/engine/validation/provider.d.ts.map +1 -1
  15. package/dist/engine/validation/provider.js.map +1 -1
  16. package/dist/engine/validation/provider.mjs.map +1 -1
  17. package/dist/errors/providers.d.ts +1 -1
  18. package/dist/errors/providers.d.ts.map +1 -1
  19. package/dist/errors/providers.js.map +1 -1
  20. package/dist/errors/providers.mjs.map +1 -1
  21. package/dist/file/providers/destination/index.d.ts +1 -1
  22. package/dist/file/providers/destination/index.d.ts.map +1 -1
  23. package/dist/file/providers/destination/index.js.map +1 -1
  24. package/dist/file/providers/destination/index.mjs.map +1 -1
  25. package/dist/file/providers/source/index.d.ts +1 -1
  26. package/dist/file/providers/source/index.d.ts.map +1 -1
  27. package/dist/file/providers/source/index.js.map +1 -1
  28. package/dist/file/providers/source/index.mjs.map +1 -1
  29. package/dist/strapi/providers/local-destination/assets-destination-writable.d.ts +9 -4
  30. package/dist/strapi/providers/local-destination/assets-destination-writable.d.ts.map +1 -1
  31. package/dist/strapi/providers/local-destination/assets-destination-writable.js +67 -49
  32. package/dist/strapi/providers/local-destination/assets-destination-writable.js.map +1 -1
  33. package/dist/strapi/providers/local-destination/assets-destination-writable.mjs +67 -49
  34. package/dist/strapi/providers/local-destination/assets-destination-writable.mjs.map +1 -1
  35. package/dist/strapi/providers/local-destination/index.d.ts +1 -1
  36. package/dist/strapi/providers/local-destination/index.d.ts.map +1 -1
  37. package/dist/strapi/providers/local-destination/index.js.map +1 -1
  38. package/dist/strapi/providers/local-destination/index.mjs.map +1 -1
  39. package/dist/strapi/providers/local-destination/strategies/restore/configuration.d.ts +1 -1
  40. package/dist/strapi/providers/local-destination/strategies/restore/configuration.d.ts.map +1 -1
  41. package/dist/strapi/providers/local-destination/strategies/restore/configuration.js.map +1 -1
  42. package/dist/strapi/providers/local-destination/strategies/restore/configuration.mjs.map +1 -1
  43. package/dist/strapi/providers/local-destination/strategies/restore/entities.d.ts +1 -1
  44. package/dist/strapi/providers/local-destination/strategies/restore/entities.d.ts.map +1 -1
  45. package/dist/strapi/providers/local-destination/strategies/restore/entities.js +13 -25
  46. package/dist/strapi/providers/local-destination/strategies/restore/entities.js.map +1 -1
  47. package/dist/strapi/providers/local-destination/strategies/restore/entities.mjs +14 -26
  48. package/dist/strapi/providers/local-destination/strategies/restore/entities.mjs.map +1 -1
  49. package/dist/strapi/providers/local-destination/strategies/restore/index.js +0 -4
  50. package/dist/strapi/providers/local-destination/strategies/restore/index.js.map +1 -1
  51. package/dist/strapi/providers/local-destination/strategies/restore/index.mjs +0 -4
  52. package/dist/strapi/providers/local-destination/strategies/restore/index.mjs.map +1 -1
  53. package/dist/strapi/providers/local-destination/strategies/restore/links.d.ts +1 -1
  54. package/dist/strapi/providers/local-destination/strategies/restore/links.d.ts.map +1 -1
  55. package/dist/strapi/providers/local-destination/strategies/restore/links.js +22 -3
  56. package/dist/strapi/providers/local-destination/strategies/restore/links.js.map +1 -1
  57. package/dist/strapi/providers/local-destination/strategies/restore/links.mjs +22 -3
  58. package/dist/strapi/providers/local-destination/strategies/restore/links.mjs.map +1 -1
  59. package/dist/strapi/providers/local-source/assets.d.ts +1 -1
  60. package/dist/strapi/providers/local-source/assets.d.ts.map +1 -1
  61. package/dist/strapi/providers/local-source/assets.js.map +1 -1
  62. package/dist/strapi/providers/local-source/assets.mjs.map +1 -1
  63. package/dist/strapi/providers/local-source/configuration.js.map +1 -1
  64. package/dist/strapi/providers/local-source/configuration.mjs.map +1 -1
  65. package/dist/strapi/providers/local-source/entities.d.ts +3 -1
  66. package/dist/strapi/providers/local-source/entities.d.ts.map +1 -1
  67. package/dist/strapi/providers/local-source/entities.js +7 -3
  68. package/dist/strapi/providers/local-source/entities.js.map +1 -1
  69. package/dist/strapi/providers/local-source/entities.mjs +7 -3
  70. package/dist/strapi/providers/local-source/entities.mjs.map +1 -1
  71. package/dist/strapi/providers/local-source/estimate-asset-totals.d.ts +1 -1
  72. package/dist/strapi/providers/local-source/estimate-asset-totals.d.ts.map +1 -1
  73. package/dist/strapi/providers/local-source/estimate-asset-totals.js.map +1 -1
  74. package/dist/strapi/providers/local-source/estimate-asset-totals.mjs.map +1 -1
  75. package/dist/strapi/providers/local-source/index.d.ts +2 -2
  76. package/dist/strapi/providers/local-source/index.d.ts.map +1 -1
  77. package/dist/strapi/providers/local-source/index.js +6 -1
  78. package/dist/strapi/providers/local-source/index.js.map +1 -1
  79. package/dist/strapi/providers/local-source/index.mjs +6 -1
  80. package/dist/strapi/providers/local-source/index.mjs.map +1 -1
  81. package/dist/strapi/providers/local-source/links.js.map +1 -1
  82. package/dist/strapi/providers/local-source/links.mjs.map +1 -1
  83. package/dist/strapi/providers/remote-destination/index.d.ts +2 -2
  84. package/dist/strapi/providers/remote-destination/index.d.ts.map +1 -1
  85. package/dist/strapi/providers/remote-destination/index.js +24 -3
  86. package/dist/strapi/providers/remote-destination/index.js.map +1 -1
  87. package/dist/strapi/providers/remote-destination/index.mjs +25 -4
  88. package/dist/strapi/providers/remote-destination/index.mjs.map +1 -1
  89. package/dist/strapi/providers/remote-source/index.d.ts +2 -2
  90. package/dist/strapi/providers/remote-source/index.d.ts.map +1 -1
  91. package/dist/strapi/providers/remote-source/index.js.map +1 -1
  92. package/dist/strapi/providers/remote-source/index.mjs.map +1 -1
  93. package/dist/strapi/providers/utils.d.ts +2 -2
  94. package/dist/strapi/providers/utils.d.ts.map +1 -1
  95. package/dist/strapi/providers/utils.js.map +1 -1
  96. package/dist/strapi/providers/utils.mjs.map +1 -1
  97. package/dist/strapi/queries/link.d.ts +1 -1
  98. package/dist/strapi/queries/link.d.ts.map +1 -1
  99. package/dist/strapi/queries/link.js.map +1 -1
  100. package/dist/strapi/queries/link.mjs.map +1 -1
  101. package/dist/strapi/remote/flows/index.d.ts +1 -1
  102. package/dist/strapi/remote/flows/index.d.ts.map +1 -1
  103. package/dist/strapi/remote/flows/index.js.map +1 -1
  104. package/dist/strapi/remote/flows/index.mjs.map +1 -1
  105. package/dist/strapi/remote/handlers/pull.d.ts +1 -1
  106. package/dist/strapi/remote/handlers/pull.d.ts.map +1 -1
  107. package/dist/strapi/remote/handlers/pull.js +3 -3
  108. package/dist/strapi/remote/handlers/pull.js.map +1 -1
  109. package/dist/strapi/remote/handlers/pull.mjs +3 -3
  110. package/dist/strapi/remote/handlers/pull.mjs.map +1 -1
  111. package/dist/strapi/remote/handlers/push.d.ts +1 -1
  112. package/dist/strapi/remote/handlers/push.d.ts.map +1 -1
  113. package/dist/strapi/remote/handlers/push.js +7 -1
  114. package/dist/strapi/remote/handlers/push.js.map +1 -1
  115. package/dist/strapi/remote/handlers/push.mjs +7 -1
  116. package/dist/strapi/remote/handlers/push.mjs.map +1 -1
  117. package/dist/strapi/remote/handlers/utils.d.ts +1 -1
  118. package/dist/strapi/remote/handlers/utils.d.ts.map +1 -1
  119. package/dist/strapi/remote/handlers/utils.js.map +1 -1
  120. package/dist/strapi/remote/handlers/utils.mjs.map +1 -1
  121. package/dist/types/common-entities.d.ts +152 -0
  122. package/dist/types/common-entities.d.ts.map +1 -0
  123. package/dist/types/encryption.d.ts +11 -0
  124. package/dist/types/encryption.d.ts.map +1 -0
  125. package/dist/types/index.d.ts +7 -0
  126. package/dist/types/index.d.ts.map +1 -0
  127. package/dist/types/providers.d.ts +50 -0
  128. package/dist/types/providers.d.ts.map +1 -0
  129. package/dist/types/remote/index.d.ts +2 -0
  130. package/dist/types/remote/index.d.ts.map +1 -0
  131. package/dist/types/remote/protocol/auth.d.ts +5 -0
  132. package/dist/types/remote/protocol/auth.d.ts.map +1 -0
  133. package/dist/types/remote/protocol/client/commands.d.ts +37 -0
  134. package/dist/types/remote/protocol/client/commands.d.ts.map +1 -0
  135. package/dist/types/remote/protocol/client/index.d.ts +9 -0
  136. package/dist/types/remote/protocol/client/index.d.ts.map +1 -0
  137. package/dist/types/remote/protocol/client/transfer/action.d.ts +5 -0
  138. package/dist/types/remote/protocol/client/transfer/action.d.ts.map +1 -0
  139. package/dist/types/remote/protocol/client/transfer/index.d.ts +12 -0
  140. package/dist/types/remote/protocol/client/transfer/index.d.ts.map +1 -0
  141. package/dist/types/remote/protocol/client/transfer/pull.d.ts +25 -0
  142. package/dist/types/remote/protocol/client/transfer/pull.d.ts.map +1 -0
  143. package/dist/types/remote/protocol/client/transfer/push.d.ts +29 -0
  144. package/dist/types/remote/protocol/client/transfer/push.d.ts.map +1 -0
  145. package/dist/types/remote/protocol/client/transfer/utils.d.ts +49 -0
  146. package/dist/types/remote/protocol/client/transfer/utils.d.ts.map +1 -0
  147. package/dist/types/remote/protocol/index.d.ts +4 -0
  148. package/dist/types/remote/protocol/index.d.ts.map +1 -0
  149. package/dist/types/remote/protocol/server/error.d.ts +18 -0
  150. package/dist/types/remote/protocol/server/error.d.ts.map +1 -0
  151. package/dist/types/remote/protocol/server/index.d.ts +3 -0
  152. package/dist/types/remote/protocol/server/index.d.ts.map +1 -0
  153. package/dist/types/remote/protocol/server/messaging.d.ts +37 -0
  154. package/dist/types/remote/protocol/server/messaging.d.ts.map +1 -0
  155. package/dist/types/transfer-engine.d.ts +149 -0
  156. package/dist/types/transfer-engine.d.ts.map +1 -0
  157. package/dist/types/utils.d.ts +83 -0
  158. package/dist/types/utils.d.ts.map +1 -0
  159. package/dist/utils/components.d.ts +21 -1
  160. package/dist/utils/components.d.ts.map +1 -1
  161. package/dist/utils/components.js +69 -21
  162. package/dist/utils/components.js.map +1 -1
  163. package/dist/utils/components.mjs +70 -22
  164. package/dist/utils/components.mjs.map +1 -1
  165. package/dist/utils/encryption/decrypt.d.ts +1 -1
  166. package/dist/utils/encryption/decrypt.d.ts.map +1 -1
  167. package/dist/utils/encryption/decrypt.js.map +1 -1
  168. package/dist/utils/encryption/decrypt.mjs.map +1 -1
  169. package/dist/utils/encryption/encrypt.d.ts +1 -1
  170. package/dist/utils/encryption/encrypt.d.ts.map +1 -1
  171. package/dist/utils/encryption/encrypt.js.map +1 -1
  172. package/dist/utils/encryption/encrypt.mjs.map +1 -1
  173. package/dist/utils/index.js +1 -0
  174. package/dist/utils/index.js.map +1 -1
  175. package/dist/utils/index.mjs +1 -1
  176. package/dist/utils/middleware.d.ts +1 -1
  177. package/dist/utils/middleware.d.ts.map +1 -1
  178. package/dist/utils/middleware.js.map +1 -1
  179. package/dist/utils/middleware.mjs.map +1 -1
  180. package/dist/utils/transaction.d.ts +1 -1
  181. package/dist/utils/transaction.d.ts.map +1 -1
  182. package/dist/utils/transaction.js.map +1 -1
  183. package/dist/utils/transaction.mjs.map +1 -1
  184. package/dist/utils/transfer-asset-chunk.d.ts +22 -0
  185. package/dist/utils/transfer-asset-chunk.d.ts.map +1 -1
  186. package/dist/utils/transfer-asset-chunk.js +25 -0
  187. package/dist/utils/transfer-asset-chunk.js.map +1 -1
  188. package/dist/utils/transfer-asset-chunk.mjs +25 -1
  189. package/dist/utils/transfer-asset-chunk.mjs.map +1 -1
  190. package/package.json +8 -8
@@ -1 +1 @@
1
- {"version":3,"file":"transaction.mjs","sources":["../../src/utils/transaction.ts"],"sourcesContent":["import { EventEmitter } from 'events';\nimport { randomUUID } from 'crypto';\nimport type { Core } from '@strapi/types';\n\nimport { Transaction, TransactionCallback } from '../../types/utils';\n\nexport const createTransaction = (strapi: Core.Strapi): Transaction => {\n const fns: { fn: TransactionCallback; uuid: string }[] = [];\n\n let done = false;\n let resume: null | (() => void) = null;\n\n const e = new EventEmitter();\n e.on('spawn', (uuid, cb) => {\n fns.push({ fn: cb, uuid });\n resume?.();\n });\n\n e.on('close', () => {\n e.removeAllListeners('rollback');\n e.removeAllListeners('spawn');\n\n done = true;\n resume?.();\n });\n\n strapi.db.transaction(async ({ trx, rollback }) => {\n e.once('rollback', async () => {\n e.removeAllListeners('close');\n e.removeAllListeners('spawn');\n\n try {\n await rollback();\n e.emit('rollback_completed');\n } catch {\n e.emit('rollback_failed');\n } finally {\n done = true;\n resume?.();\n }\n });\n\n while (!done) {\n while (fns.length) {\n const item = fns.shift();\n\n if (item) {\n const { fn, uuid } = item;\n\n try {\n const res = await fn(trx);\n e.emit(uuid, { data: res });\n } catch (error) {\n e.emit(uuid, { error });\n }\n }\n }\n if (!done && !fns.length) {\n // eslint-disable-next-line @typescript-eslint/no-loop-func\n await new Promise<void>((resolve) => {\n resume = resolve;\n });\n }\n }\n });\n\n return {\n async attach<T = undefined>(callback: TransactionCallback): Promise<T | undefined> {\n const uuid = randomUUID();\n e.emit('spawn', uuid, callback);\n return new Promise<T | undefined>((resolve, reject) => {\n e.on(uuid, ({ data, error }) => {\n if (data) {\n resolve(data);\n }\n\n if (error) {\n reject(error);\n }\n resolve(undefined);\n });\n });\n },\n\n end() {\n return e.emit('close');\n },\n\n rollback() {\n return new Promise<boolean>((resolve) => {\n e.emit('rollback');\n\n e.once('rollback_failed', () => resolve(false));\n e.once('rollback_completed', () => resolve(true));\n });\n },\n };\n};\n"],"names":["createTransaction","strapi","fns","done","resume","e","EventEmitter","on","uuid","cb","push","fn","removeAllListeners","db","transaction","trx","rollback","once","emit","length","item","shift","res","data","error","Promise","resolve","attach","callback","randomUUID","reject","undefined","end"],"mappings":";;;AAMO,MAAMA,oBAAoB,CAACC,MAAAA,GAAAA;AAChC,IAAA,MAAMC,MAAmD,EAAE;AAE3D,IAAA,IAAIC,IAAAA,GAAO,KAAA;AACX,IAAA,IAAIC,MAAAA,GAA8B,IAAA;AAElC,IAAA,MAAMC,IAAI,IAAIC,YAAAA,EAAAA;AACdD,IAAAA,CAAAA,CAAEE,EAAE,CAAC,OAAA,EAAS,CAACC,IAAAA,EAAMC,EAAAA,GAAAA;AACnBP,QAAAA,GAAAA,CAAIQ,IAAI,CAAC;YAAEC,EAAAA,EAAIF,EAAAA;AAAID,YAAAA;AAAK,SAAA,CAAA;AACxBJ,QAAAA,MAAAA,IAAAA;AACF,IAAA,CAAA,CAAA;IAEAC,CAAAA,CAAEE,EAAE,CAAC,OAAA,EAAS,IAAA;AACZF,QAAAA,CAAAA,CAAEO,kBAAkB,CAAC,UAAA,CAAA;AACrBP,QAAAA,CAAAA,CAAEO,kBAAkB,CAAC,OAAA,CAAA;QAErBT,IAAAA,GAAO,IAAA;AACPC,QAAAA,MAAAA,IAAAA;AACF,IAAA,CAAA,CAAA;IAEAH,MAAAA,CAAOY,EAAE,CAACC,WAAW,CAAC,OAAO,EAAEC,GAAG,EAAEC,QAAQ,EAAE,GAAA;QAC5CX,CAAAA,CAAEY,IAAI,CAAC,UAAA,EAAY,UAAA;AACjBZ,YAAAA,CAAAA,CAAEO,kBAAkB,CAAC,OAAA,CAAA;AACrBP,YAAAA,CAAAA,CAAEO,kBAAkB,CAAC,OAAA,CAAA;YAErB,IAAI;gBACF,MAAMI,QAAAA,EAAAA;AACNX,gBAAAA,CAAAA,CAAEa,IAAI,CAAC,oBAAA,CAAA;AACT,YAAA,CAAA,CAAE,OAAM;AACNb,gBAAAA,CAAAA,CAAEa,IAAI,CAAC,iBAAA,CAAA;YACT,CAAA,QAAU;gBACRf,IAAAA,GAAO,IAAA;AACPC,gBAAAA,MAAAA,IAAAA;AACF,YAAA;AACF,QAAA,CAAA,CAAA;AAEA,QAAA,MAAO,CAACD,IAAAA,CAAM;YACZ,MAAOD,GAAAA,CAAIiB,MAAM,CAAE;gBACjB,MAAMC,IAAAA,GAAOlB,IAAImB,KAAK,EAAA;AAEtB,gBAAA,IAAID,IAAAA,EAAM;AACR,oBAAA,MAAM,EAAET,EAAE,EAAEH,IAAI,EAAE,GAAGY,IAAAA;oBAErB,IAAI;wBACF,MAAME,GAAAA,GAAM,MAAMX,EAAAA,CAAGI,GAAAA,CAAAA;wBACrBV,CAAAA,CAAEa,IAAI,CAACV,IAAAA,EAAM;4BAAEe,IAAAA,EAAMD;AAAI,yBAAA,CAAA;AAC3B,oBAAA,CAAA,CAAE,OAAOE,KAAAA,EAAO;wBACdnB,CAAAA,CAAEa,IAAI,CAACV,IAAAA,EAAM;AAAEgB,4BAAAA;AAAM,yBAAA,CAAA;AACvB,oBAAA;AACF,gBAAA;AACF,YAAA;AACA,YAAA,IAAI,CAACrB,IAAAA,IAAQ,CAACD,GAAAA,CAAIiB,MAAM,EAAE;;gBAExB,MAAM,IAAIM,QAAc,CAACC,OAAAA,GAAAA;oBACvBtB,MAAAA,GAASsB,OAAAA;AACX,gBAAA,CAAA,CAAA;AACF,YAAA;AACF,QAAA;AACF,IAAA,CAAA,CAAA;IAEA,OAAO;AACL,QAAA,MAAMC,QAAsBC,QAA6B,EAAA;AACvD,YAAA,MAAMpB,IAAAA,GAAOqB,UAAAA,EAAAA;YACbxB,CAAAA,CAAEa,IAAI,CAAC,OAAA,EAASV,IAAAA,EAAMoB,QAAAA,CAAAA;YACtB,OAAO,IAAIH,OAAAA,CAAuB,CAACC,OAAAA,EAASI,MAAAA,GAAAA;gBAC1CzB,CAAAA,CAAEE,EAAE,CAACC,IAAAA,EAAM,CAAC,EAAEe,IAAI,EAAEC,KAAK,EAAE,GAAA;AACzB,oBAAA,IAAID,IAAAA,EAAM;wBACRG,OAAAA,CAAQH,IAAAA,CAAAA;AACV,oBAAA;AAEA,oBAAA,IAAIC,KAAAA,EAAO;wBACTM,MAAAA,CAAON,KAAAA,CAAAA;AACT,oBAAA;oBACAE,OAAAA,CAAQK,SAAAA,CAAAA;AACV,gBAAA,CAAA,CAAA;AACF,YAAA,CAAA,CAAA;AACF,QAAA,CAAA;AAEAC,QAAAA,GAAAA,CAAAA,GAAAA;YACE,OAAO3B,CAAAA,CAAEa,IAAI,CAAC,OAAA,CAAA;AAChB,QAAA,CAAA;AAEAF,QAAAA,QAAAA,CAAAA,GAAAA;YACE,OAAO,IAAIS,QAAiB,CAACC,OAAAA,GAAAA;AAC3BrB,gBAAAA,CAAAA,CAAEa,IAAI,CAAC,UAAA,CAAA;AAEPb,gBAAAA,CAAAA,CAAEY,IAAI,CAAC,iBAAA,EAAmB,IAAMS,OAAAA,CAAQ,KAAA,CAAA,CAAA;AACxCrB,gBAAAA,CAAAA,CAAEY,IAAI,CAAC,oBAAA,EAAsB,IAAMS,OAAAA,CAAQ,IAAA,CAAA,CAAA;AAC7C,YAAA,CAAA,CAAA;AACF,QAAA;AACF,KAAA;AACF;;;;"}
1
+ {"version":3,"file":"transaction.mjs","sources":["../../src/utils/transaction.ts"],"sourcesContent":["import { EventEmitter } from 'events';\nimport { randomUUID } from 'crypto';\nimport type { Core } from '@strapi/types';\n\nimport { Transaction, TransactionCallback } from '../types/utils';\n\nexport const createTransaction = (strapi: Core.Strapi): Transaction => {\n const fns: { fn: TransactionCallback; uuid: string }[] = [];\n\n let done = false;\n let resume: null | (() => void) = null;\n\n const e = new EventEmitter();\n e.on('spawn', (uuid, cb) => {\n fns.push({ fn: cb, uuid });\n resume?.();\n });\n\n e.on('close', () => {\n e.removeAllListeners('rollback');\n e.removeAllListeners('spawn');\n\n done = true;\n resume?.();\n });\n\n strapi.db.transaction(async ({ trx, rollback }) => {\n e.once('rollback', async () => {\n e.removeAllListeners('close');\n e.removeAllListeners('spawn');\n\n try {\n await rollback();\n e.emit('rollback_completed');\n } catch {\n e.emit('rollback_failed');\n } finally {\n done = true;\n resume?.();\n }\n });\n\n while (!done) {\n while (fns.length) {\n const item = fns.shift();\n\n if (item) {\n const { fn, uuid } = item;\n\n try {\n const res = await fn(trx);\n e.emit(uuid, { data: res });\n } catch (error) {\n e.emit(uuid, { error });\n }\n }\n }\n if (!done && !fns.length) {\n // eslint-disable-next-line @typescript-eslint/no-loop-func\n await new Promise<void>((resolve) => {\n resume = resolve;\n });\n }\n }\n });\n\n return {\n async attach<T = undefined>(callback: TransactionCallback): Promise<T | undefined> {\n const uuid = randomUUID();\n e.emit('spawn', uuid, callback);\n return new Promise<T | undefined>((resolve, reject) => {\n e.on(uuid, ({ data, error }) => {\n if (data) {\n resolve(data);\n }\n\n if (error) {\n reject(error);\n }\n resolve(undefined);\n });\n });\n },\n\n end() {\n return e.emit('close');\n },\n\n rollback() {\n return new Promise<boolean>((resolve) => {\n e.emit('rollback');\n\n e.once('rollback_failed', () => resolve(false));\n e.once('rollback_completed', () => resolve(true));\n });\n },\n };\n};\n"],"names":["createTransaction","strapi","fns","done","resume","e","EventEmitter","on","uuid","cb","push","fn","removeAllListeners","db","transaction","trx","rollback","once","emit","length","item","shift","res","data","error","Promise","resolve","attach","callback","randomUUID","reject","undefined","end"],"mappings":"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"}
@@ -10,6 +10,28 @@ export declare function createTransferAssetStreamChunk(assetID: string, chunk: B
10
10
  encoding: 'base64';
11
11
  data: string;
12
12
  };
13
+ /**
14
+ * Legacy asset-chunk shape for remotes that pre-date #23479 and do `Buffer.from(item.data.data)`
15
+ * in their push handler. Used only when init negotiation indicates the remote does not understand
16
+ * {@link createTransferAssetStreamChunk}'s `encoding: 'base64'` field (the base64 string on `data`
17
+ * would leave `item.data.data` undefined and crash those remotes with `Buffer.from(undefined)`).
18
+ *
19
+ * `buffer.toJSON()` returns `{ type: 'Buffer', data: number[] }` — a plain object the WebSocket
20
+ * replacer passes through untouched, so the receiver sees the same shape the old default
21
+ * `JSON.stringify(Buffer)` used to produce.
22
+ *
23
+ * Note: this shape is ~6× larger on the wire than base64 and allocates the full byte array during
24
+ * `JSON.parse`, which is what #23479 was fixing for large files. Only use this when negotiation
25
+ * proves the remote cannot decode base64.
26
+ */
27
+ export declare function createTransferAssetStreamChunkLegacy(assetID: string, chunk: Buffer | Uint8Array): {
28
+ action: 'stream';
29
+ assetID: string;
30
+ data: {
31
+ type: 'Buffer';
32
+ data: number[];
33
+ };
34
+ };
13
35
  /**
14
36
  * Decode a stream item from `TransferAssetFlow` after `JSON.parse` (shared by push + pull handlers
15
37
  * and the remote source provider).
@@ -1 +1 @@
1
- {"version":3,"file":"transfer-asset-chunk.d.ts","sourceRoot":"","sources":["../../src/utils/transfer-asset-chunk.ts"],"names":[],"mappings":";;AAAA;;;GAGG;AACH,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,GAAG,UAAU,GACzB;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAazE;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CAAC,IAAI,EAAE;IAClD,MAAM,EAAE,QAAQ,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB,GAAG,MAAM,CAKT;AAgBD;;;;;;;;;;;GAWG;AACH,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,MAAM,CAsBxF;AAED,yEAAyE;AACzE,wBAAgB,kCAAkC,CAAC,KAAK,EAAE;IACxD,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB,GAAG,MAAM,CAqBT"}
1
+ {"version":3,"file":"transfer-asset-chunk.d.ts","sourceRoot":"","sources":["../../src/utils/transfer-asset-chunk.ts"],"names":[],"mappings":";;AAAA;;;GAGG;AACH,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,GAAG,UAAU,GACzB;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAazE;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,oCAAoC,CAClD,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,GAAG,UAAU,GACzB;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE;QAAE,IAAI,EAAE,QAAQ,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE,CAAA;CAAE,CAYjF;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CAAC,IAAI,EAAE;IAClD,MAAM,EAAE,QAAQ,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB,GAAG,MAAM,CAKT;AAgBD;;;;;;;;;;;GAWG;AACH,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,MAAM,CAsBxF;AAED,yEAAyE;AACzE,wBAAgB,kCAAkC,CAAC,KAAK,EAAE;IACxD,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB,GAAG,MAAM,CAqBT"}
@@ -15,6 +15,30 @@
15
15
  data: buffer.toString('base64')
16
16
  };
17
17
  }
18
+ /**
19
+ * Legacy asset-chunk shape for remotes that pre-date #23479 and do `Buffer.from(item.data.data)`
20
+ * in their push handler. Used only when init negotiation indicates the remote does not understand
21
+ * {@link createTransferAssetStreamChunk}'s `encoding: 'base64'` field (the base64 string on `data`
22
+ * would leave `item.data.data` undefined and crash those remotes with `Buffer.from(undefined)`).
23
+ *
24
+ * `buffer.toJSON()` returns `{ type: 'Buffer', data: number[] }` — a plain object the WebSocket
25
+ * replacer passes through untouched, so the receiver sees the same shape the old default
26
+ * `JSON.stringify(Buffer)` used to produce.
27
+ *
28
+ * Note: this shape is ~6× larger on the wire than base64 and allocates the full byte array during
29
+ * `JSON.parse`, which is what #23479 was fixing for large files. Only use this when negotiation
30
+ * proves the remote cannot decode base64.
31
+ */ function createTransferAssetStreamChunkLegacy(assetID, chunk) {
32
+ if (chunk == null) {
33
+ throw new TypeError('Asset stream yielded a null/undefined chunk; refusing to encode (would trigger Buffer.from(undefined))');
34
+ }
35
+ const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
36
+ return {
37
+ action: 'stream',
38
+ assetID,
39
+ data: buffer.toJSON()
40
+ };
41
+ }
18
42
  /**
19
43
  * Decode a stream item from `TransferAssetFlow` after `JSON.parse` (shared by push + pull handlers
20
44
  * and the remote source provider).
@@ -87,6 +111,7 @@ const getLegacyBufferJsonData = (value)=>{
87
111
  }
88
112
 
89
113
  exports.createTransferAssetStreamChunk = createTransferAssetStreamChunk;
114
+ exports.createTransferAssetStreamChunkLegacy = createTransferAssetStreamChunkLegacy;
90
115
  exports.decodeTransferAssetStreamData = decodeTransferAssetStreamData;
91
116
  exports.decodeTransferAssetStreamItem = decodeTransferAssetStreamItem;
92
117
  exports.transferAssetStreamChunkByteLength = transferAssetStreamChunkByteLength;
@@ -1 +1 @@
1
- {"version":3,"file":"transfer-asset-chunk.js","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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"}
1
+ {"version":3,"file":"transfer-asset-chunk.js","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 * Legacy asset-chunk shape for remotes that pre-date #23479 and do `Buffer.from(item.data.data)`\n * in their push handler. Used only when init negotiation indicates the remote does not understand\n * {@link createTransferAssetStreamChunk}'s `encoding: 'base64'` field (the base64 string on `data`\n * would leave `item.data.data` undefined and crash those remotes with `Buffer.from(undefined)`).\n *\n * `buffer.toJSON()` returns `{ type: 'Buffer', data: number[] }` — a plain object the WebSocket\n * replacer passes through untouched, so the receiver sees the same shape the old default\n * `JSON.stringify(Buffer)` used to produce.\n *\n * Note: this shape is ~6× larger on the wire than base64 and allocates the full byte array during\n * `JSON.parse`, which is what #23479 was fixing for large files. Only use this when negotiation\n * proves the remote cannot decode base64.\n */\nexport function createTransferAssetStreamChunkLegacy(\n assetID: string,\n chunk: Buffer | Uint8Array\n): { action: 'stream'; assetID: string; data: { type: 'Buffer'; data: number[] } } {\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 data: buffer.toJSON(),\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","createTransferAssetStreamChunkLegacy","toJSON","decodeTransferAssetStreamItem","item","decodeTransferAssetStreamData","undefined","getLegacyBufferJsonData","value","type","raw","Array","isArray","ArrayBuffer","isView","legacyBufferData","transferAssetStreamChunkByteLength","Math","floor","length","byteLength"],"mappings":"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"}
@@ -13,6 +13,30 @@
13
13
  data: buffer.toString('base64')
14
14
  };
15
15
  }
16
+ /**
17
+ * Legacy asset-chunk shape for remotes that pre-date #23479 and do `Buffer.from(item.data.data)`
18
+ * in their push handler. Used only when init negotiation indicates the remote does not understand
19
+ * {@link createTransferAssetStreamChunk}'s `encoding: 'base64'` field (the base64 string on `data`
20
+ * would leave `item.data.data` undefined and crash those remotes with `Buffer.from(undefined)`).
21
+ *
22
+ * `buffer.toJSON()` returns `{ type: 'Buffer', data: number[] }` — a plain object the WebSocket
23
+ * replacer passes through untouched, so the receiver sees the same shape the old default
24
+ * `JSON.stringify(Buffer)` used to produce.
25
+ *
26
+ * Note: this shape is ~6× larger on the wire than base64 and allocates the full byte array during
27
+ * `JSON.parse`, which is what #23479 was fixing for large files. Only use this when negotiation
28
+ * proves the remote cannot decode base64.
29
+ */ function createTransferAssetStreamChunkLegacy(assetID, chunk) {
30
+ if (chunk == null) {
31
+ throw new TypeError('Asset stream yielded a null/undefined chunk; refusing to encode (would trigger Buffer.from(undefined))');
32
+ }
33
+ const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
34
+ return {
35
+ action: 'stream',
36
+ assetID,
37
+ data: buffer.toJSON()
38
+ };
39
+ }
16
40
  /**
17
41
  * Decode a stream item from `TransferAssetFlow` after `JSON.parse` (shared by push + pull handlers
18
42
  * and the remote source provider).
@@ -84,5 +108,5 @@ const getLegacyBufferJsonData = (value)=>{
84
108
  return 0;
85
109
  }
86
110
 
87
- export { createTransferAssetStreamChunk, decodeTransferAssetStreamData, decodeTransferAssetStreamItem, transferAssetStreamChunkByteLength };
111
+ export { createTransferAssetStreamChunk, createTransferAssetStreamChunkLegacy, decodeTransferAssetStreamData, decodeTransferAssetStreamItem, transferAssetStreamChunkByteLength };
88
112
  //# sourceMappingURL=transfer-asset-chunk.mjs.map
@@ -1 +1 @@
1
- {"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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"}
1
+ {"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 * Legacy asset-chunk shape for remotes that pre-date #23479 and do `Buffer.from(item.data.data)`\n * in their push handler. Used only when init negotiation indicates the remote does not understand\n * {@link createTransferAssetStreamChunk}'s `encoding: 'base64'` field (the base64 string on `data`\n * would leave `item.data.data` undefined and crash those remotes with `Buffer.from(undefined)`).\n *\n * `buffer.toJSON()` returns `{ type: 'Buffer', data: number[] }` — a plain object the WebSocket\n * replacer passes through untouched, so the receiver sees the same shape the old default\n * `JSON.stringify(Buffer)` used to produce.\n *\n * Note: this shape is ~6× larger on the wire than base64 and allocates the full byte array during\n * `JSON.parse`, which is what #23479 was fixing for large files. Only use this when negotiation\n * proves the remote cannot decode base64.\n */\nexport function createTransferAssetStreamChunkLegacy(\n assetID: string,\n chunk: Buffer | Uint8Array\n): { action: 'stream'; assetID: string; data: { type: 'Buffer'; data: number[] } } {\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 data: buffer.toJSON(),\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","createTransferAssetStreamChunkLegacy","toJSON","decodeTransferAssetStreamItem","item","decodeTransferAssetStreamData","undefined","getLegacyBufferJsonData","value","type","raw","Array","isArray","ArrayBuffer","isView","legacyBufferData","transferAssetStreamChunkByteLength","Math","floor","length","byteLength"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@strapi/data-transfer",
3
- "version": "5.48.0",
3
+ "version": "5.48.1",
4
4
  "description": "Data transfer capabilities for Strapi",
5
5
  "keywords": [
6
6
  "strapi",
@@ -51,9 +51,9 @@
51
51
  "watch": "run -T rollup -c -w"
52
52
  },
53
53
  "dependencies": {
54
- "@strapi/logger": "5.48.0",
55
- "@strapi/types": "5.48.0",
56
- "@strapi/utils": "5.48.0",
54
+ "@strapi/logger": "5.48.1",
55
+ "@strapi/types": "5.48.1",
56
+ "@strapi/utils": "5.48.1",
57
57
  "chalk": "4.1.2",
58
58
  "cli-table3": "0.6.5",
59
59
  "commander": "8.3.0",
@@ -64,13 +64,13 @@
64
64
  "resolve-cwd": "3.0.0",
65
65
  "semver": "7.7.4",
66
66
  "stream-chain": "2.2.5",
67
- "stream-json": "1.8.0",
67
+ "stream-json": "1.9.1",
68
68
  "tar": "7.5.11",
69
69
  "tar-stream": "2.2.0",
70
70
  "ws": "8.20.1"
71
71
  },
72
72
  "devDependencies": {
73
- "@strapi/database": "5.48.0",
73
+ "@strapi/database": "5.48.1",
74
74
  "@types/fs-extra": "11.0.4",
75
75
  "@types/jest": "29.5.2",
76
76
  "@types/koa": "2.13.4",
@@ -78,7 +78,7 @@
78
78
  "@types/node": "24.10.0",
79
79
  "@types/semver": "7.5.0",
80
80
  "@types/stream-chain": "2.0.1",
81
- "@types/stream-json": "1.7.3",
81
+ "@types/stream-json": "1.7.8",
82
82
  "@types/tar-stream": "2.2.2",
83
83
  "@types/ws": "^8.5.4",
84
84
  "knex": "3.0.1",
@@ -87,7 +87,7 @@
87
87
  "typescript": "5.4.5"
88
88
  },
89
89
  "engines": {
90
- "node": ">=20.0.0 <=24.x.x",
90
+ "node": ">=20.0.0 <=26.x.x",
91
91
  "npm": ">=6.0.0"
92
92
  }
93
93
  }