@strapi/data-transfer 5.42.1 → 5.44.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 (126) hide show
  1. package/dist/directory/providers/source/index.d.ts.map +1 -1
  2. package/dist/directory/providers/source/index.js +3 -2
  3. package/dist/directory/providers/source/index.js.map +1 -1
  4. package/dist/directory/providers/source/index.mjs +3 -2
  5. package/dist/directory/providers/source/index.mjs.map +1 -1
  6. package/dist/engine/index.d.ts.map +1 -1
  7. package/dist/engine/index.js +130 -5
  8. package/dist/engine/index.js.map +1 -1
  9. package/dist/engine/index.mjs +130 -5
  10. package/dist/engine/index.mjs.map +1 -1
  11. package/dist/engine/validation/schemas/index.js +2 -0
  12. package/dist/engine/validation/schemas/index.js.map +1 -1
  13. package/dist/engine/validation/schemas/index.mjs +2 -0
  14. package/dist/engine/validation/schemas/index.mjs.map +1 -1
  15. package/dist/file/providers/source/index.d.ts.map +1 -1
  16. package/dist/file/providers/source/index.js +84 -45
  17. package/dist/file/providers/source/index.js.map +1 -1
  18. package/dist/file/providers/source/index.mjs +85 -46
  19. package/dist/file/providers/source/index.mjs.map +1 -1
  20. package/dist/strapi/providers/index.js +2 -0
  21. package/dist/strapi/providers/index.js.map +1 -1
  22. package/dist/strapi/providers/index.mjs +1 -0
  23. package/dist/strapi/providers/index.mjs.map +1 -1
  24. package/dist/strapi/providers/local-destination/assets-destination-writable.d.ts +22 -0
  25. package/dist/strapi/providers/local-destination/assets-destination-writable.d.ts.map +1 -0
  26. package/dist/strapi/providers/local-destination/assets-destination-writable.js +107 -0
  27. package/dist/strapi/providers/local-destination/assets-destination-writable.js.map +1 -0
  28. package/dist/strapi/providers/local-destination/assets-destination-writable.mjs +105 -0
  29. package/dist/strapi/providers/local-destination/assets-destination-writable.mjs.map +1 -0
  30. package/dist/strapi/providers/local-destination/index.d.ts +2 -0
  31. package/dist/strapi/providers/local-destination/index.d.ts.map +1 -1
  32. package/dist/strapi/providers/local-destination/index.js +18 -79
  33. package/dist/strapi/providers/local-destination/index.js.map +1 -1
  34. package/dist/strapi/providers/local-destination/index.mjs +18 -79
  35. package/dist/strapi/providers/local-destination/index.mjs.map +1 -1
  36. package/dist/strapi/providers/local-destination/strategies/restore/entities.js +2 -0
  37. package/dist/strapi/providers/local-destination/strategies/restore/entities.js.map +1 -1
  38. package/dist/strapi/providers/local-destination/strategies/restore/entities.mjs +2 -0
  39. package/dist/strapi/providers/local-destination/strategies/restore/entities.mjs.map +1 -1
  40. package/dist/strapi/providers/local-destination/strategies/restore/index.js +2 -0
  41. package/dist/strapi/providers/local-destination/strategies/restore/index.js.map +1 -1
  42. package/dist/strapi/providers/local-destination/strategies/restore/index.mjs +2 -0
  43. package/dist/strapi/providers/local-destination/strategies/restore/index.mjs.map +1 -1
  44. package/dist/strapi/providers/local-source/assets.d.ts +8 -1
  45. package/dist/strapi/providers/local-source/assets.d.ts.map +1 -1
  46. package/dist/strapi/providers/local-source/assets.js +47 -19
  47. package/dist/strapi/providers/local-source/assets.js.map +1 -1
  48. package/dist/strapi/providers/local-source/assets.mjs +46 -20
  49. package/dist/strapi/providers/local-source/assets.mjs.map +1 -1
  50. package/dist/strapi/providers/local-source/estimate-asset-totals.d.ts +11 -0
  51. package/dist/strapi/providers/local-source/estimate-asset-totals.d.ts.map +1 -0
  52. package/dist/strapi/providers/local-source/estimate-asset-totals.js +130 -0
  53. package/dist/strapi/providers/local-source/estimate-asset-totals.js.map +1 -0
  54. package/dist/strapi/providers/local-source/estimate-asset-totals.mjs +128 -0
  55. package/dist/strapi/providers/local-source/estimate-asset-totals.mjs.map +1 -0
  56. package/dist/strapi/providers/local-source/index.d.ts +3 -2
  57. package/dist/strapi/providers/local-source/index.d.ts.map +1 -1
  58. package/dist/strapi/providers/local-source/index.js +30 -3
  59. package/dist/strapi/providers/local-source/index.js.map +1 -1
  60. package/dist/strapi/providers/local-source/index.mjs +30 -4
  61. package/dist/strapi/providers/local-source/index.mjs.map +1 -1
  62. package/dist/strapi/providers/remote-destination/index.d.ts +3 -1
  63. package/dist/strapi/providers/remote-destination/index.d.ts.map +1 -1
  64. package/dist/strapi/providers/remote-destination/index.js +88 -19
  65. package/dist/strapi/providers/remote-destination/index.js.map +1 -1
  66. package/dist/strapi/providers/remote-destination/index.mjs +89 -20
  67. package/dist/strapi/providers/remote-destination/index.mjs.map +1 -1
  68. package/dist/strapi/providers/remote-source/index.d.ts +6 -3
  69. package/dist/strapi/providers/remote-source/index.d.ts.map +1 -1
  70. package/dist/strapi/providers/remote-source/index.js +180 -47
  71. package/dist/strapi/providers/remote-source/index.js.map +1 -1
  72. package/dist/strapi/providers/remote-source/index.mjs +181 -48
  73. package/dist/strapi/providers/remote-source/index.mjs.map +1 -1
  74. package/dist/strapi/providers/utils.d.ts +9 -6
  75. package/dist/strapi/providers/utils.d.ts.map +1 -1
  76. package/dist/strapi/providers/utils.js +9 -4
  77. package/dist/strapi/providers/utils.js.map +1 -1
  78. package/dist/strapi/providers/utils.mjs +9 -4
  79. package/dist/strapi/providers/utils.mjs.map +1 -1
  80. package/dist/strapi/remote/handlers/pull.d.ts +1 -0
  81. package/dist/strapi/remote/handlers/pull.d.ts.map +1 -1
  82. package/dist/strapi/remote/handlers/pull.js +36 -15
  83. package/dist/strapi/remote/handlers/pull.js.map +1 -1
  84. package/dist/strapi/remote/handlers/pull.mjs +37 -16
  85. package/dist/strapi/remote/handlers/pull.mjs.map +1 -1
  86. package/dist/strapi/remote/handlers/push.d.ts +13 -2
  87. package/dist/strapi/remote/handlers/push.d.ts.map +1 -1
  88. package/dist/strapi/remote/handlers/push.js +81 -34
  89. package/dist/strapi/remote/handlers/push.js.map +1 -1
  90. package/dist/strapi/remote/handlers/push.mjs +82 -35
  91. package/dist/strapi/remote/handlers/push.mjs.map +1 -1
  92. package/dist/strapi/remote/handlers/utils.d.ts.map +1 -1
  93. package/dist/strapi/remote/handlers/utils.js +5 -3
  94. package/dist/strapi/remote/handlers/utils.js.map +1 -1
  95. package/dist/strapi/remote/handlers/utils.mjs +5 -3
  96. package/dist/strapi/remote/handlers/utils.mjs.map +1 -1
  97. package/dist/utils/index.d.ts +2 -0
  98. package/dist/utils/index.d.ts.map +1 -1
  99. package/dist/utils/index.js +7 -0
  100. package/dist/utils/index.js.map +1 -1
  101. package/dist/utils/index.mjs +2 -0
  102. package/dist/utils/index.mjs.map +1 -1
  103. package/dist/utils/stream.d.ts.map +1 -1
  104. package/dist/utils/stream.js +40 -3
  105. package/dist/utils/stream.js.map +1 -1
  106. package/dist/utils/stream.mjs +40 -3
  107. package/dist/utils/stream.mjs.map +1 -1
  108. package/dist/utils/transfer-asset-chunk.d.ts +41 -0
  109. package/dist/utils/transfer-asset-chunk.d.ts.map +1 -0
  110. package/dist/utils/transfer-asset-chunk.js +93 -0
  111. package/dist/utils/transfer-asset-chunk.js.map +1 -0
  112. package/dist/utils/transfer-asset-chunk.mjs +88 -0
  113. package/dist/utils/transfer-asset-chunk.mjs.map +1 -0
  114. package/dist/utils/transfer-websocket-json.d.ts +24 -0
  115. package/dist/utils/transfer-websocket-json.d.ts.map +1 -0
  116. package/dist/utils/transfer-websocket-json.js +67 -0
  117. package/dist/utils/transfer-websocket-json.js.map +1 -0
  118. package/dist/utils/transfer-websocket-json.mjs +63 -0
  119. package/dist/utils/transfer-websocket-json.mjs.map +1 -0
  120. package/dist/utils/writable-async-write.d.ts +17 -0
  121. package/dist/utils/writable-async-write.d.ts.map +1 -0
  122. package/dist/utils/writable-async-write.js +61 -0
  123. package/dist/utils/writable-async-write.js.map +1 -0
  124. package/dist/utils/writable-async-write.mjs +59 -0
  125. package/dist/utils/writable-async-write.mjs.map +1 -0
  126. package/package.json +8 -8
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../src/strapi/providers/local-source/index.ts"],"sourcesContent":["import { Readable } from 'stream';\nimport { chain } from 'stream-chain';\nimport type { Core, Struct } from '@strapi/types';\n\nimport type { IMetadata, ISourceProvider, ProviderType } from '../../../../types';\nimport type { IDiagnosticReporter } from '../../../utils/diagnostic';\nimport { createEntitiesStream, createEntitiesTransformStream } from './entities';\nimport { createLinksStream } from './links';\nimport { createConfigurationStream } from './configuration';\nimport { createAssetsStream } from './assets';\nimport * as utils from '../../../utils';\nimport { assertValidStrapi } from '../../../utils/providers';\n\nexport interface ILocalStrapiSourceProviderOptions {\n getStrapi(): Core.Strapi | Promise<Core.Strapi>; // return an initialized instance of Strapi\n\n autoDestroy?: boolean; // shut down the instance returned by getStrapi() at the end of the transfer\n}\n\nexport const createLocalStrapiSourceProvider = (options: ILocalStrapiSourceProviderOptions) => {\n return new LocalStrapiSourceProvider(options);\n};\n\nclass LocalStrapiSourceProvider implements ISourceProvider {\n name = 'source::local-strapi';\n\n type: ProviderType = 'source';\n\n options: ILocalStrapiSourceProviderOptions;\n\n strapi?: Core.Strapi;\n\n #diagnostics?: IDiagnosticReporter;\n\n constructor(options: ILocalStrapiSourceProviderOptions) {\n this.options = options;\n }\n\n async bootstrap(diagnostics?: IDiagnosticReporter): Promise<void> {\n this.#diagnostics = diagnostics;\n this.strapi = await this.options.getStrapi();\n this.strapi.db.lifecycles.disable();\n }\n\n #reportInfo(message: string) {\n this.#diagnostics?.report({\n details: {\n createdAt: new Date(),\n message,\n origin: 'local-source-provider',\n },\n kind: 'info',\n });\n }\n\n /**\n * Reports an error to the diagnostic reporter.\n */\n #reportError(message: string, error: Error) {\n this.#diagnostics?.report({\n details: {\n createdAt: new Date(),\n message,\n error,\n severity: 'fatal',\n name: error.name,\n },\n kind: 'error',\n });\n }\n\n /**\n * Handles errors that occur in read streams.\n */\n #handleStreamError(streamType: string, err: Error) {\n const { message, stack } = err;\n const errorMessage = `[Data transfer] Error in ${streamType} read stream: ${message}`;\n const formattedError = {\n message: errorMessage,\n stack,\n timestamp: new Date().toISOString(),\n };\n\n this.strapi?.log.error(formattedError);\n this.#reportError(formattedError.message, err);\n }\n\n async close(): Promise<void> {\n const { autoDestroy } = this.options;\n assertValidStrapi(this.strapi);\n this.strapi.db.lifecycles.enable();\n // Basically `!== false` but more deterministic\n if (autoDestroy === undefined || autoDestroy === true) {\n await this.strapi?.destroy();\n }\n }\n\n getMetadata(): IMetadata {\n this.#reportInfo('getting metadata');\n const strapiVersion = strapi.config.get<string>('info.strapi');\n const createdAt = new Date().toISOString();\n\n return {\n createdAt,\n strapi: {\n version: strapiVersion,\n },\n };\n }\n\n async createEntitiesReadStream(): Promise<Readable> {\n assertValidStrapi(this.strapi, 'Not able to stream entities');\n this.#reportInfo('creating entities read stream');\n return chain([\n // Entities stream\n createEntitiesStream(this.strapi),\n\n // Transform stream\n createEntitiesTransformStream(),\n ]);\n }\n\n createLinksReadStream(): Readable {\n assertValidStrapi(this.strapi, 'Not able to stream links');\n this.#reportInfo('creating links read stream');\n\n return createLinksStream(this.strapi);\n }\n\n createConfigurationReadStream(): Readable {\n assertValidStrapi(this.strapi, 'Not able to stream configuration');\n this.#reportInfo('creating configuration read stream');\n return createConfigurationStream(this.strapi);\n }\n\n getSchemas(): Record<string, Struct.Schema> {\n assertValidStrapi(this.strapi, 'Not able to get Schemas');\n this.#reportInfo('getting schemas');\n const schemas = utils.schema.schemasToValidJSON({\n ...this.strapi.contentTypes,\n ...this.strapi.components,\n });\n\n return utils.schema.mapSchemasValues(schemas);\n }\n\n createSchemasReadStream(): Readable {\n return Readable.from(Object.values(this.getSchemas()));\n }\n\n createAssetsReadStream(): Readable {\n assertValidStrapi(this.strapi, 'Not able to stream assets');\n this.#reportInfo('creating assets read stream');\n\n const stream = createAssetsStream(this.strapi);\n stream.on('error', (err) => {\n this.#handleStreamError('assets', err);\n });\n\n return stream;\n }\n}\n\nexport type ILocalStrapiSourceProvider = InstanceType<typeof LocalStrapiSourceProvider>;\n"],"names":["createLocalStrapiSourceProvider","options","LocalStrapiSourceProvider","bootstrap","diagnostics","strapi","getStrapi","db","lifecycles","disable","close","autoDestroy","assertValidStrapi","enable","undefined","destroy","getMetadata","strapiVersion","config","get","createdAt","Date","toISOString","version","createEntitiesReadStream","chain","createEntitiesStream","createEntitiesTransformStream","createLinksReadStream","createLinksStream","createConfigurationReadStream","createConfigurationStream","getSchemas","schemas","utils","contentTypes","components","createSchemasReadStream","Readable","from","Object","values","createAssetsReadStream","stream","createAssetsStream","on","err","name","type","message","report","details","origin","kind","error","severity","streamType","stack","errorMessage","formattedError","timestamp","log"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../../src/strapi/providers/local-source/index.ts"],"sourcesContent":["import { Readable } from 'stream';\nimport { chain } from 'stream-chain';\nimport type { Core, Struct } from '@strapi/types';\n\nimport type { IMetadata, ISourceProvider, ProviderType, TransferStage } from '../../../../types';\nimport type { IDiagnosticReporter } from '../../../utils/diagnostic';\nimport { createEntitiesStream, createEntitiesTransformStream } from './entities';\nimport { createLinksStream } from './links';\nimport { createConfigurationStream } from './configuration';\nimport { createAssetsStream } from './assets';\nimport { estimateAssetTotals } from './estimate-asset-totals';\nimport * as utils from '../../../utils';\nimport { assertValidStrapi } from '../../../utils/providers';\n\nexport interface ILocalStrapiSourceProviderOptions {\n getStrapi(): Core.Strapi | Promise<Core.Strapi>; // return an initialized instance of Strapi\n\n autoDestroy?: boolean; // shut down the instance returned by getStrapi() at the end of the transfer\n}\n\nexport const createLocalStrapiSourceProvider = (options: ILocalStrapiSourceProviderOptions) => {\n return new LocalStrapiSourceProvider(options);\n};\n\nclass LocalStrapiSourceProvider implements ISourceProvider {\n name = 'source::local-strapi';\n\n type: ProviderType = 'source';\n\n options: ILocalStrapiSourceProviderOptions;\n\n strapi?: Core.Strapi;\n\n #diagnostics?: IDiagnosticReporter;\n\n constructor(options: ILocalStrapiSourceProviderOptions) {\n this.options = options;\n }\n\n async bootstrap(diagnostics?: IDiagnosticReporter): Promise<void> {\n this.#diagnostics = diagnostics;\n this.strapi = await this.options.getStrapi();\n this.strapi.db.lifecycles.disable();\n }\n\n #reportInfo(message: string) {\n this.#diagnostics?.report({\n details: {\n createdAt: new Date(),\n message,\n origin: 'local-source-provider',\n },\n kind: 'info',\n });\n }\n\n #reportWarning(message: string) {\n this.#diagnostics?.report({\n details: {\n createdAt: new Date(),\n message,\n origin: 'local-source-provider',\n },\n kind: 'warning',\n });\n }\n\n /**\n * Reports an error to the diagnostic reporter.\n */\n #reportError(message: string, error: Error) {\n this.#diagnostics?.report({\n details: {\n createdAt: new Date(),\n message,\n error,\n severity: 'fatal',\n name: error.name,\n },\n kind: 'error',\n });\n }\n\n /**\n * Handles errors that occur in read streams.\n */\n #handleStreamError(streamType: string, err: Error) {\n const { message, stack } = err;\n const errorMessage = `[Data transfer] Error in ${streamType} read stream: ${message}`;\n const formattedError = {\n message: errorMessage,\n stack,\n timestamp: new Date().toISOString(),\n };\n\n this.strapi?.log.error(formattedError);\n this.#reportError(formattedError.message, err);\n }\n\n async close(): Promise<void> {\n const { autoDestroy } = this.options;\n assertValidStrapi(this.strapi);\n this.strapi.db.lifecycles.enable();\n // Basically `!== false` but more deterministic\n if (autoDestroy === undefined || autoDestroy === true) {\n await this.strapi?.destroy();\n }\n }\n\n getMetadata(): IMetadata {\n this.#reportInfo('getting metadata');\n assertValidStrapi(this.strapi);\n const strapiVersion = this.strapi.config.get<string>('info.strapi');\n const createdAt = new Date().toISOString();\n\n return {\n createdAt,\n strapi: {\n version: strapiVersion,\n },\n };\n }\n\n async createEntitiesReadStream(): Promise<Readable> {\n assertValidStrapi(this.strapi, 'Not able to stream entities');\n this.#reportInfo('creating entities read stream');\n return chain([\n // Entities stream\n createEntitiesStream(this.strapi),\n\n // Transform stream\n createEntitiesTransformStream(),\n ]);\n }\n\n createLinksReadStream(): Readable {\n assertValidStrapi(this.strapi, 'Not able to stream links');\n this.#reportInfo('creating links read stream');\n\n return createLinksStream(this.strapi);\n }\n\n createConfigurationReadStream(): Readable {\n assertValidStrapi(this.strapi, 'Not able to stream configuration');\n this.#reportInfo('creating configuration read stream');\n return createConfigurationStream(this.strapi);\n }\n\n getSchemas(): Record<string, Struct.Schema> {\n assertValidStrapi(this.strapi, 'Not able to get Schemas');\n this.#reportInfo('getting schemas');\n const schemas = utils.schema.schemasToValidJSON({\n ...this.strapi.contentTypes,\n ...this.strapi.components,\n });\n\n return utils.schema.mapSchemasValues(schemas);\n }\n\n createSchemasReadStream(): Readable {\n return Readable.from(Object.values(this.getSchemas()));\n }\n\n createAssetsReadStream(): Readable {\n assertValidStrapi(this.strapi, 'Not able to stream assets');\n this.#reportInfo('creating assets read stream');\n\n const stream = createAssetsStream(this.strapi, {\n onWarning: (message) => this.#reportWarning(message),\n });\n stream.on('error', (err) => {\n this.#handleStreamError('assets', err);\n });\n\n return stream;\n }\n\n async getStageTotals(stage: TransferStage) {\n if (stage !== 'assets') {\n return null;\n }\n assertValidStrapi(this.strapi, 'Not able to estimate asset totals');\n return estimateAssetTotals(this.strapi);\n }\n}\n\nexport type ILocalStrapiSourceProvider = InstanceType<typeof LocalStrapiSourceProvider>;\n\nexport { estimateAssetTotals } from './estimate-asset-totals';\n"],"names":["createLocalStrapiSourceProvider","options","LocalStrapiSourceProvider","bootstrap","diagnostics","strapi","getStrapi","db","lifecycles","disable","close","autoDestroy","assertValidStrapi","enable","undefined","destroy","getMetadata","strapiVersion","config","get","createdAt","Date","toISOString","version","createEntitiesReadStream","chain","createEntitiesStream","createEntitiesTransformStream","createLinksReadStream","createLinksStream","createConfigurationReadStream","createConfigurationStream","getSchemas","schemas","utils","contentTypes","components","createSchemasReadStream","Readable","from","Object","values","createAssetsReadStream","stream","createAssetsStream","onWarning","message","on","err","getStageTotals","stage","estimateAssetTotals","name","type","report","details","origin","kind","error","severity","streamType","stack","errorMessage","formattedError","timestamp","log"],"mappings":"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"}
@@ -4,7 +4,10 @@ import { createEntitiesStream, createEntitiesTransformStream } from './entities.
4
4
  import { createLinksStream } from './links.mjs';
5
5
  import { createConfigurationStream } from './configuration.mjs';
6
6
  import { createAssetsStream } from './assets.mjs';
7
+ import { estimateAssetTotals } from './estimate-asset-totals.mjs';
7
8
  import 'crypto';
9
+ import 'node:events';
10
+ import 'node:stream/promises';
8
11
  import 'lodash/fp';
9
12
  import { schemasToValidJSON, mapSchemasValues } from '../../../utils/schema.mjs';
10
13
  import 'events';
@@ -23,7 +26,7 @@ function _class_private_field_loose_key(name) {
23
26
  const createLocalStrapiSourceProvider = (options)=>{
24
27
  return new LocalStrapiSourceProvider(options);
25
28
  };
26
- var _diagnostics = /*#__PURE__*/ _class_private_field_loose_key("_diagnostics"), _reportInfo = /*#__PURE__*/ _class_private_field_loose_key("_reportInfo"), /**
29
+ var _diagnostics = /*#__PURE__*/ _class_private_field_loose_key("_diagnostics"), _reportInfo = /*#__PURE__*/ _class_private_field_loose_key("_reportInfo"), _reportWarning = /*#__PURE__*/ _class_private_field_loose_key("_reportWarning"), /**
27
30
  * Reports an error to the diagnostic reporter.
28
31
  */ _reportError = /*#__PURE__*/ _class_private_field_loose_key("_reportError"), /**
29
32
  * Handles errors that occur in read streams.
@@ -45,7 +48,8 @@ class LocalStrapiSourceProvider {
45
48
  }
46
49
  getMetadata() {
47
50
  _class_private_field_loose_base(this, _reportInfo)[_reportInfo]('getting metadata');
48
- const strapiVersion = strapi.config.get('info.strapi');
51
+ assertValidStrapi(this.strapi);
52
+ const strapiVersion = this.strapi.config.get('info.strapi');
49
53
  const createdAt = new Date().toISOString();
50
54
  return {
51
55
  createdAt,
@@ -89,16 +93,28 @@ class LocalStrapiSourceProvider {
89
93
  createAssetsReadStream() {
90
94
  assertValidStrapi(this.strapi, 'Not able to stream assets');
91
95
  _class_private_field_loose_base(this, _reportInfo)[_reportInfo]('creating assets read stream');
92
- const stream = createAssetsStream(this.strapi);
96
+ const stream = createAssetsStream(this.strapi, {
97
+ onWarning: (message)=>_class_private_field_loose_base(this, _reportWarning)[_reportWarning](message)
98
+ });
93
99
  stream.on('error', (err)=>{
94
100
  _class_private_field_loose_base(this, _handleStreamError)[_handleStreamError]('assets', err);
95
101
  });
96
102
  return stream;
97
103
  }
104
+ async getStageTotals(stage) {
105
+ if (stage !== 'assets') {
106
+ return null;
107
+ }
108
+ assertValidStrapi(this.strapi, 'Not able to estimate asset totals');
109
+ return estimateAssetTotals(this.strapi);
110
+ }
98
111
  constructor(options){
99
112
  Object.defineProperty(this, _reportInfo, {
100
113
  value: reportInfo
101
114
  });
115
+ Object.defineProperty(this, _reportWarning, {
116
+ value: reportWarning
117
+ });
102
118
  Object.defineProperty(this, _reportError, {
103
119
  value: reportError
104
120
  });
@@ -124,6 +140,16 @@ function reportInfo(message) {
124
140
  kind: 'info'
125
141
  });
126
142
  }
143
+ function reportWarning(message) {
144
+ _class_private_field_loose_base(this, _diagnostics)[_diagnostics]?.report({
145
+ details: {
146
+ createdAt: new Date(),
147
+ message,
148
+ origin: 'local-source-provider'
149
+ },
150
+ kind: 'warning'
151
+ });
152
+ }
127
153
  function reportError(message, error) {
128
154
  _class_private_field_loose_base(this, _diagnostics)[_diagnostics]?.report({
129
155
  details: {
@@ -148,5 +174,5 @@ function handleStreamError(streamType, err) {
148
174
  _class_private_field_loose_base(this, _reportError)[_reportError](formattedError.message, err);
149
175
  }
150
176
 
151
- export { createLocalStrapiSourceProvider };
177
+ export { createLocalStrapiSourceProvider, estimateAssetTotals };
152
178
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../../src/strapi/providers/local-source/index.ts"],"sourcesContent":["import { Readable } from 'stream';\nimport { chain } from 'stream-chain';\nimport type { Core, Struct } from '@strapi/types';\n\nimport type { IMetadata, ISourceProvider, ProviderType } from '../../../../types';\nimport type { IDiagnosticReporter } from '../../../utils/diagnostic';\nimport { createEntitiesStream, createEntitiesTransformStream } from './entities';\nimport { createLinksStream } from './links';\nimport { createConfigurationStream } from './configuration';\nimport { createAssetsStream } from './assets';\nimport * as utils from '../../../utils';\nimport { assertValidStrapi } from '../../../utils/providers';\n\nexport interface ILocalStrapiSourceProviderOptions {\n getStrapi(): Core.Strapi | Promise<Core.Strapi>; // return an initialized instance of Strapi\n\n autoDestroy?: boolean; // shut down the instance returned by getStrapi() at the end of the transfer\n}\n\nexport const createLocalStrapiSourceProvider = (options: ILocalStrapiSourceProviderOptions) => {\n return new LocalStrapiSourceProvider(options);\n};\n\nclass LocalStrapiSourceProvider implements ISourceProvider {\n name = 'source::local-strapi';\n\n type: ProviderType = 'source';\n\n options: ILocalStrapiSourceProviderOptions;\n\n strapi?: Core.Strapi;\n\n #diagnostics?: IDiagnosticReporter;\n\n constructor(options: ILocalStrapiSourceProviderOptions) {\n this.options = options;\n }\n\n async bootstrap(diagnostics?: IDiagnosticReporter): Promise<void> {\n this.#diagnostics = diagnostics;\n this.strapi = await this.options.getStrapi();\n this.strapi.db.lifecycles.disable();\n }\n\n #reportInfo(message: string) {\n this.#diagnostics?.report({\n details: {\n createdAt: new Date(),\n message,\n origin: 'local-source-provider',\n },\n kind: 'info',\n });\n }\n\n /**\n * Reports an error to the diagnostic reporter.\n */\n #reportError(message: string, error: Error) {\n this.#diagnostics?.report({\n details: {\n createdAt: new Date(),\n message,\n error,\n severity: 'fatal',\n name: error.name,\n },\n kind: 'error',\n });\n }\n\n /**\n * Handles errors that occur in read streams.\n */\n #handleStreamError(streamType: string, err: Error) {\n const { message, stack } = err;\n const errorMessage = `[Data transfer] Error in ${streamType} read stream: ${message}`;\n const formattedError = {\n message: errorMessage,\n stack,\n timestamp: new Date().toISOString(),\n };\n\n this.strapi?.log.error(formattedError);\n this.#reportError(formattedError.message, err);\n }\n\n async close(): Promise<void> {\n const { autoDestroy } = this.options;\n assertValidStrapi(this.strapi);\n this.strapi.db.lifecycles.enable();\n // Basically `!== false` but more deterministic\n if (autoDestroy === undefined || autoDestroy === true) {\n await this.strapi?.destroy();\n }\n }\n\n getMetadata(): IMetadata {\n this.#reportInfo('getting metadata');\n const strapiVersion = strapi.config.get<string>('info.strapi');\n const createdAt = new Date().toISOString();\n\n return {\n createdAt,\n strapi: {\n version: strapiVersion,\n },\n };\n }\n\n async createEntitiesReadStream(): Promise<Readable> {\n assertValidStrapi(this.strapi, 'Not able to stream entities');\n this.#reportInfo('creating entities read stream');\n return chain([\n // Entities stream\n createEntitiesStream(this.strapi),\n\n // Transform stream\n createEntitiesTransformStream(),\n ]);\n }\n\n createLinksReadStream(): Readable {\n assertValidStrapi(this.strapi, 'Not able to stream links');\n this.#reportInfo('creating links read stream');\n\n return createLinksStream(this.strapi);\n }\n\n createConfigurationReadStream(): Readable {\n assertValidStrapi(this.strapi, 'Not able to stream configuration');\n this.#reportInfo('creating configuration read stream');\n return createConfigurationStream(this.strapi);\n }\n\n getSchemas(): Record<string, Struct.Schema> {\n assertValidStrapi(this.strapi, 'Not able to get Schemas');\n this.#reportInfo('getting schemas');\n const schemas = utils.schema.schemasToValidJSON({\n ...this.strapi.contentTypes,\n ...this.strapi.components,\n });\n\n return utils.schema.mapSchemasValues(schemas);\n }\n\n createSchemasReadStream(): Readable {\n return Readable.from(Object.values(this.getSchemas()));\n }\n\n createAssetsReadStream(): Readable {\n assertValidStrapi(this.strapi, 'Not able to stream assets');\n this.#reportInfo('creating assets read stream');\n\n const stream = createAssetsStream(this.strapi);\n stream.on('error', (err) => {\n this.#handleStreamError('assets', err);\n });\n\n return stream;\n }\n}\n\nexport type ILocalStrapiSourceProvider = InstanceType<typeof LocalStrapiSourceProvider>;\n"],"names":["createLocalStrapiSourceProvider","options","LocalStrapiSourceProvider","bootstrap","diagnostics","strapi","getStrapi","db","lifecycles","disable","close","autoDestroy","assertValidStrapi","enable","undefined","destroy","getMetadata","strapiVersion","config","get","createdAt","Date","toISOString","version","createEntitiesReadStream","chain","createEntitiesStream","createEntitiesTransformStream","createLinksReadStream","createLinksStream","createConfigurationReadStream","createConfigurationStream","getSchemas","schemas","utils","contentTypes","components","createSchemasReadStream","Readable","from","Object","values","createAssetsReadStream","stream","createAssetsStream","on","err","name","type","message","report","details","origin","kind","error","severity","streamType","stack","errorMessage","formattedError","timestamp","log"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../../src/strapi/providers/local-source/index.ts"],"sourcesContent":["import { Readable } from 'stream';\nimport { chain } from 'stream-chain';\nimport type { Core, Struct } from '@strapi/types';\n\nimport type { IMetadata, ISourceProvider, ProviderType, TransferStage } from '../../../../types';\nimport type { IDiagnosticReporter } from '../../../utils/diagnostic';\nimport { createEntitiesStream, createEntitiesTransformStream } from './entities';\nimport { createLinksStream } from './links';\nimport { createConfigurationStream } from './configuration';\nimport { createAssetsStream } from './assets';\nimport { estimateAssetTotals } from './estimate-asset-totals';\nimport * as utils from '../../../utils';\nimport { assertValidStrapi } from '../../../utils/providers';\n\nexport interface ILocalStrapiSourceProviderOptions {\n getStrapi(): Core.Strapi | Promise<Core.Strapi>; // return an initialized instance of Strapi\n\n autoDestroy?: boolean; // shut down the instance returned by getStrapi() at the end of the transfer\n}\n\nexport const createLocalStrapiSourceProvider = (options: ILocalStrapiSourceProviderOptions) => {\n return new LocalStrapiSourceProvider(options);\n};\n\nclass LocalStrapiSourceProvider implements ISourceProvider {\n name = 'source::local-strapi';\n\n type: ProviderType = 'source';\n\n options: ILocalStrapiSourceProviderOptions;\n\n strapi?: Core.Strapi;\n\n #diagnostics?: IDiagnosticReporter;\n\n constructor(options: ILocalStrapiSourceProviderOptions) {\n this.options = options;\n }\n\n async bootstrap(diagnostics?: IDiagnosticReporter): Promise<void> {\n this.#diagnostics = diagnostics;\n this.strapi = await this.options.getStrapi();\n this.strapi.db.lifecycles.disable();\n }\n\n #reportInfo(message: string) {\n this.#diagnostics?.report({\n details: {\n createdAt: new Date(),\n message,\n origin: 'local-source-provider',\n },\n kind: 'info',\n });\n }\n\n #reportWarning(message: string) {\n this.#diagnostics?.report({\n details: {\n createdAt: new Date(),\n message,\n origin: 'local-source-provider',\n },\n kind: 'warning',\n });\n }\n\n /**\n * Reports an error to the diagnostic reporter.\n */\n #reportError(message: string, error: Error) {\n this.#diagnostics?.report({\n details: {\n createdAt: new Date(),\n message,\n error,\n severity: 'fatal',\n name: error.name,\n },\n kind: 'error',\n });\n }\n\n /**\n * Handles errors that occur in read streams.\n */\n #handleStreamError(streamType: string, err: Error) {\n const { message, stack } = err;\n const errorMessage = `[Data transfer] Error in ${streamType} read stream: ${message}`;\n const formattedError = {\n message: errorMessage,\n stack,\n timestamp: new Date().toISOString(),\n };\n\n this.strapi?.log.error(formattedError);\n this.#reportError(formattedError.message, err);\n }\n\n async close(): Promise<void> {\n const { autoDestroy } = this.options;\n assertValidStrapi(this.strapi);\n this.strapi.db.lifecycles.enable();\n // Basically `!== false` but more deterministic\n if (autoDestroy === undefined || autoDestroy === true) {\n await this.strapi?.destroy();\n }\n }\n\n getMetadata(): IMetadata {\n this.#reportInfo('getting metadata');\n assertValidStrapi(this.strapi);\n const strapiVersion = this.strapi.config.get<string>('info.strapi');\n const createdAt = new Date().toISOString();\n\n return {\n createdAt,\n strapi: {\n version: strapiVersion,\n },\n };\n }\n\n async createEntitiesReadStream(): Promise<Readable> {\n assertValidStrapi(this.strapi, 'Not able to stream entities');\n this.#reportInfo('creating entities read stream');\n return chain([\n // Entities stream\n createEntitiesStream(this.strapi),\n\n // Transform stream\n createEntitiesTransformStream(),\n ]);\n }\n\n createLinksReadStream(): Readable {\n assertValidStrapi(this.strapi, 'Not able to stream links');\n this.#reportInfo('creating links read stream');\n\n return createLinksStream(this.strapi);\n }\n\n createConfigurationReadStream(): Readable {\n assertValidStrapi(this.strapi, 'Not able to stream configuration');\n this.#reportInfo('creating configuration read stream');\n return createConfigurationStream(this.strapi);\n }\n\n getSchemas(): Record<string, Struct.Schema> {\n assertValidStrapi(this.strapi, 'Not able to get Schemas');\n this.#reportInfo('getting schemas');\n const schemas = utils.schema.schemasToValidJSON({\n ...this.strapi.contentTypes,\n ...this.strapi.components,\n });\n\n return utils.schema.mapSchemasValues(schemas);\n }\n\n createSchemasReadStream(): Readable {\n return Readable.from(Object.values(this.getSchemas()));\n }\n\n createAssetsReadStream(): Readable {\n assertValidStrapi(this.strapi, 'Not able to stream assets');\n this.#reportInfo('creating assets read stream');\n\n const stream = createAssetsStream(this.strapi, {\n onWarning: (message) => this.#reportWarning(message),\n });\n stream.on('error', (err) => {\n this.#handleStreamError('assets', err);\n });\n\n return stream;\n }\n\n async getStageTotals(stage: TransferStage) {\n if (stage !== 'assets') {\n return null;\n }\n assertValidStrapi(this.strapi, 'Not able to estimate asset totals');\n return estimateAssetTotals(this.strapi);\n }\n}\n\nexport type ILocalStrapiSourceProvider = InstanceType<typeof LocalStrapiSourceProvider>;\n\nexport { estimateAssetTotals } from './estimate-asset-totals';\n"],"names":["createLocalStrapiSourceProvider","options","LocalStrapiSourceProvider","bootstrap","diagnostics","strapi","getStrapi","db","lifecycles","disable","close","autoDestroy","assertValidStrapi","enable","undefined","destroy","getMetadata","strapiVersion","config","get","createdAt","Date","toISOString","version","createEntitiesReadStream","chain","createEntitiesStream","createEntitiesTransformStream","createLinksReadStream","createLinksStream","createConfigurationReadStream","createConfigurationStream","getSchemas","schemas","utils","contentTypes","components","createSchemasReadStream","Readable","from","Object","values","createAssetsReadStream","stream","createAssetsStream","onWarning","message","on","err","getStageTotals","stage","estimateAssetTotals","name","type","report","details","origin","kind","error","severity","streamType","stack","errorMessage","formattedError","timestamp","log"],"mappings":"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"}
@@ -7,13 +7,15 @@ import type { IDestinationProvider, IMetadata, ProviderType, TransferStage } fro
7
7
  import type { IDiagnosticReporter } from '../../../utils/diagnostic';
8
8
  import type { Auth } from '../../../../types/remote/protocol';
9
9
  import type { ILocalStrapiDestinationProviderOptions } from '../local-destination';
10
- export interface IRemoteStrapiDestinationProviderOptions extends Pick<ILocalStrapiDestinationProviderOptions, 'restore' | 'strategy'> {
10
+ export interface IRemoteStrapiDestinationProviderOptions extends Pick<ILocalStrapiDestinationProviderOptions, 'restore' | 'strategy' | 'onTransferPhase'> {
11
11
  url: URL;
12
12
  auth?: Auth.ITransferTokenAuth;
13
13
  retryMessageOptions?: {
14
14
  retryMessageTimeout: number;
15
15
  retryMessageMaxRetries: number;
16
16
  };
17
+ /** Include per-asset stream checksums and require peers to validate on receive. */
18
+ verifyChecksums?: boolean;
17
19
  }
18
20
  declare class RemoteStrapiDestinationProvider implements IDestinationProvider {
19
21
  #private;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/strapi/providers/remote-destination/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAE/B,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEnD,OAAO,EAAE,gBAAgB,EAAyC,MAAM,UAAU,CAAC;AAEnF,OAAO,KAAK,EACV,oBAAoB,EACpB,SAAS,EACT,YAAY,EAEZ,aAAa,EAEd,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,KAAK,EAAkB,IAAI,EAAE,MAAM,mCAAmC,CAAC;AAC9E,OAAO,KAAK,EAAE,sCAAsC,EAAE,MAAM,sBAAsB,CAAC;AAInF,MAAM,WAAW,uCACf,SAAQ,IAAI,CAAC,sCAAsC,EAAE,SAAS,GAAG,UAAU,CAAC;IAC5E,GAAG,EAAE,GAAG,CAAC;IACT,IAAI,CAAC,EAAE,IAAI,CAAC,kBAAkB,CAAC;IAC/B,mBAAmB,CAAC,EAAE;QACpB,mBAAmB,EAAE,MAAM,CAAC;QAC5B,sBAAsB,EAAE,MAAM,CAAC;KAChC,CAAC;CACH;AAID,cAAM,+BAAgC,YAAW,oBAAoB;;IACnE,IAAI,SAAgC;IAEpC,IAAI,EAAE,YAAY,CAAiB;IAEnC,OAAO,EAAE,uCAAuC,CAAC;IAEjD,EAAE,EAAE,SAAS,GAAG,IAAI,CAAC;IAErB,UAAU,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,GAAG,IAAI,CAAC;IAEvD,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAE1B,KAAK,EAAG;SAAG,MAAM,IAAI,OAAO,CAAC,aAAa,EAAE,SAAS,CAAC,GAAG;YAAE,KAAK,EAAE,MAAM,CAAA;SAAE;KAAE,CAAC;gBAIjE,OAAO,EAAE,uCAAuC;IAS5D,OAAO,CAAC,UAAU;IASZ,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;IAsK/B,SAAS,CAAC,WAAW,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IA+D3D,KAAK;IAuBX,WAAW;IAIL,cAAc;IAId,QAAQ;IAId,UAAU;IAQV,yBAAyB,IAAI,QAAQ;IAIrC,sBAAsB,IAAI,QAAQ;IAIlC,8BAA8B,IAAI,QAAQ;IAI1C,uBAAuB,IAAI,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;CAiFxD;AAED,eAAO,MAAM,qCAAqC,YACvC,uCAAuC,oCAGjD,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/strapi/providers/remote-destination/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAE/B,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEnD,OAAO,EAAE,gBAAgB,EAAyC,MAAM,UAAU,CAAC;AAEnF,OAAO,KAAK,EACV,oBAAoB,EACpB,SAAS,EACT,YAAY,EAEZ,aAAa,EAEd,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,KAAK,EAAkB,IAAI,EAAE,MAAM,mCAAmC,CAAC;AAC9E,OAAO,KAAK,EAAE,sCAAsC,EAAE,MAAM,sBAAsB,CAAC;AAQnF,MAAM,WAAW,uCACf,SAAQ,IAAI,CAAC,sCAAsC,EAAE,SAAS,GAAG,UAAU,GAAG,iBAAiB,CAAC;IAChG,GAAG,EAAE,GAAG,CAAC;IACT,IAAI,CAAC,EAAE,IAAI,CAAC,kBAAkB,CAAC;IAC/B,mBAAmB,CAAC,EAAE;QACpB,mBAAmB,EAAE,MAAM,CAAC;QAC5B,sBAAsB,EAAE,MAAM,CAAC;KAChC,CAAC;IACF,mFAAmF;IACnF,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAwBD,cAAM,+BAAgC,YAAW,oBAAoB;;IACnE,IAAI,SAAgC;IAEpC,IAAI,EAAE,YAAY,CAAiB;IAEnC,OAAO,EAAE,uCAAuC,CAAC;IAEjD,EAAE,EAAE,SAAS,GAAG,IAAI,CAAC;IAErB,UAAU,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,GAAG,IAAI,CAAC;IAEvD,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAE1B,KAAK,EAAG;SAAG,MAAM,IAAI,OAAO,CAAC,aAAa,EAAE,SAAS,CAAC,GAAG;YAAE,KAAK,EAAE,MAAM,CAAA;SAAE;KAAE,CAAC;gBAMjE,OAAO,EAAE,uCAAuC;IAU5D,OAAO,CAAC,UAAU;IASZ,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;IAyN/B,SAAS,CAAC,WAAW,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IA+D3D,KAAK;IAuBX,WAAW;IAIL,cAAc;IAOd,QAAQ;IAId,UAAU;IAQV,yBAAyB,IAAI,QAAQ;IAIrC,sBAAsB,IAAI,QAAQ;IAIlC,8BAA8B,IAAI,QAAQ;IAI1C,uBAAuB,IAAI,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;CAqFxD;AAED,eAAO,MAAM,qCAAqC,YACvC,uCAAuC,oCAGjD,CAAC"}
@@ -6,6 +6,7 @@ var fp = require('lodash/fp');
6
6
  var utils = require('../utils.js');
7
7
  var constants = require('../../remote/constants.js');
8
8
  var providers = require('../../../errors/providers.js');
9
+ var transferAssetChunk = require('../../../utils/transfer-asset-chunk.js');
9
10
 
10
11
  function _class_private_field_loose_base(receiver, privateKey) {
11
12
  if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) {
@@ -18,7 +19,21 @@ function _class_private_field_loose_key(name) {
18
19
  return "__private_" + id++ + "_" + name;
19
20
  }
20
21
  const jsonLength = (obj)=>Buffer.byteLength(JSON.stringify(obj));
21
- var _diagnostics = /*#__PURE__*/ _class_private_field_loose_key("_diagnostics"), _startStepOnce = /*#__PURE__*/ _class_private_field_loose_key("_startStepOnce"), _startStep = /*#__PURE__*/ _class_private_field_loose_key("_startStep"), _endStep = /*#__PURE__*/ _class_private_field_loose_key("_endStep"), _streamStep = /*#__PURE__*/ _class_private_field_loose_key("_streamStep"), _writeStream = /*#__PURE__*/ _class_private_field_loose_key("_writeStream"), _reportInfo = /*#__PURE__*/ _class_private_field_loose_key("_reportInfo");
22
+ /**
23
+ * Default batching for entities / links / configuration over WebSocket push.
24
+ *
25
+ * Goals: (1) enough payload per round-trip to stay efficient on large transfers,
26
+ * (2) small enough per message that the remote can process and ack without multi-minute stalls,
27
+ * (3) bounded gap between engine progress and the wire (see item cap + age).
28
+ *
29
+ * These are fixed defaults (not tuned per dataset) so behavior is predictable everywhere.
30
+ */ const STREAM_STEP_MAX_BATCH_BYTES = 512 * 1024;
31
+ /** Caps parallel work per message and how far UI count can lead the network for tiny rows. */ const STREAM_STEP_MAX_BATCH_ITEMS = 100;
32
+ /**
33
+ * If the first row in the current batch has waited this long, flush before appending more.
34
+ * Helps mixed-size streams (e.g. occasional large rows) without relying on tiny byte caps alone.
35
+ */ const STREAM_STEP_MAX_BATCH_AGE_MS = 450;
36
+ var _diagnostics = /*#__PURE__*/ _class_private_field_loose_key("_diagnostics"), _checksumsEnabled = /*#__PURE__*/ _class_private_field_loose_key("_checksumsEnabled"), _startStepOnce = /*#__PURE__*/ _class_private_field_loose_key("_startStepOnce"), _startStep = /*#__PURE__*/ _class_private_field_loose_key("_startStep"), _endStep = /*#__PURE__*/ _class_private_field_loose_key("_endStep"), _streamStep = /*#__PURE__*/ _class_private_field_loose_key("_streamStep"), _writeStream = /*#__PURE__*/ _class_private_field_loose_key("_writeStream"), _reportInfo = /*#__PURE__*/ _class_private_field_loose_key("_reportInfo"), _reportWarning = /*#__PURE__*/ _class_private_field_loose_key("_reportWarning");
22
37
  class RemoteStrapiDestinationProvider {
23
38
  resetStats() {
24
39
  this.stats = {
@@ -38,6 +53,7 @@ class RemoteStrapiDestinationProvider {
38
53
  }
39
54
  async initTransfer() {
40
55
  const { strategy, restore } = this.options;
56
+ const wantsChecksums = this.options.verifyChecksums === true;
41
57
  const query = this.dispatcher?.dispatchCommand({
42
58
  command: 'init',
43
59
  params: {
@@ -45,13 +61,20 @@ class RemoteStrapiDestinationProvider {
45
61
  strategy,
46
62
  restore
47
63
  },
48
- transfer: 'push'
64
+ transfer: 'push',
65
+ ...wantsChecksums ? {
66
+ checksums: true
67
+ } : {}
49
68
  }
50
69
  });
51
70
  const res = await query;
52
71
  if (!res?.transferID) {
53
72
  throw new providers.ProviderTransferError('Init failed, invalid response from the server');
54
73
  }
74
+ _class_private_field_loose_base(this, _checksumsEnabled)[_checksumsEnabled] = wantsChecksums && res.checksums === true;
75
+ if (wantsChecksums && res.checksums !== true) {
76
+ _class_private_field_loose_base(this, _reportWarning)[_reportWarning]('[Data transfer][push] Checksums were requested but the remote does not support checksum negotiation; continuing without checksum validation.');
77
+ }
55
78
  this.resetStats();
56
79
  return res.transferID;
57
80
  }
@@ -132,6 +155,7 @@ class RemoteStrapiDestinationProvider {
132
155
  return this.dispatcher?.dispatchTransferAction('getMetadata') ?? null;
133
156
  }
134
157
  async beforeTransfer() {
158
+ this.options.onTransferPhase?.('Remote: waiting for server to clear data and prepare destination…');
135
159
  await this.dispatcher?.dispatchTransferAction('beforeTransfer');
136
160
  }
137
161
  async rollback() {
@@ -155,9 +179,10 @@ class RemoteStrapiDestinationProvider {
155
179
  createAssetsWriteStream() {
156
180
  let batch = [];
157
181
  let hasStarted = false;
182
+ const verifyChecksums = _class_private_field_loose_base(this, _checksumsEnabled)[_checksumsEnabled];
158
183
  const batchSize = 1024 * 1024; // 1MB;
159
184
  const batchLength = ()=>{
160
- return batch.reduce((acc, chunk)=>chunk.action === 'stream' ? acc + chunk.data.byteLength : acc, 0);
185
+ return batch.reduce((acc, chunk)=>acc + transferAssetChunk.transferAssetStreamChunkByteLength(chunk), 0);
161
186
  };
162
187
  const startAssetsTransferOnce = _class_private_field_loose_base(this, _startStepOnce)[_startStepOnce]('assets');
163
188
  const flush = async ()=>{
@@ -196,6 +221,7 @@ class RemoteStrapiDestinationProvider {
196
221
  hasStarted = true;
197
222
  const assetID = crypto.randomUUID();
198
223
  const { filename, filepath, stats, stream, metadata } = asset;
224
+ const checksumHash = verifyChecksums ? crypto.createHash('sha256') : undefined;
199
225
  try {
200
226
  await safePush({
201
227
  action: 'start',
@@ -208,21 +234,22 @@ class RemoteStrapiDestinationProvider {
208
234
  }
209
235
  });
210
236
  for await (const chunk of stream){
211
- await safePush({
212
- action: 'stream',
213
- assetID,
214
- data: chunk
215
- });
237
+ checksumHash?.update(chunk);
238
+ await safePush(transferAssetChunk.createTransferAssetStreamChunk(assetID, chunk));
216
239
  }
217
240
  await safePush({
218
241
  action: 'end',
219
- assetID
242
+ assetID,
243
+ ...checksumHash ? {
244
+ checksum: {
245
+ algorithm: 'sha256',
246
+ value: checksumHash.digest('hex')
247
+ }
248
+ } : {}
220
249
  });
221
250
  callback();
222
251
  } catch (error) {
223
- if (error instanceof Error) {
224
- callback(error);
225
- }
252
+ callback(error instanceof Error ? error : new Error(String(error)));
226
253
  }
227
254
  }
228
255
  });
@@ -246,16 +273,25 @@ class RemoteStrapiDestinationProvider {
246
273
  Object.defineProperty(this, _reportInfo, {
247
274
  value: reportInfo
248
275
  });
276
+ Object.defineProperty(this, _reportWarning, {
277
+ value: reportWarning
278
+ });
249
279
  Object.defineProperty(this, _diagnostics, {
250
280
  writable: true,
251
281
  value: void 0
252
282
  });
283
+ Object.defineProperty(this, _checksumsEnabled, {
284
+ writable: true,
285
+ value: void 0
286
+ });
253
287
  this.name = 'destination::remote-strapi';
254
288
  this.type = 'destination';
289
+ _class_private_field_loose_base(this, _checksumsEnabled)[_checksumsEnabled] = false;
255
290
  this.options = options;
256
291
  this.ws = null;
257
292
  this.dispatcher = null;
258
293
  this.transferID = null;
294
+ _class_private_field_loose_base(this, _checksumsEnabled)[_checksumsEnabled] = options.verifyChecksums === true;
259
295
  this.resetStats();
260
296
  }
261
297
  }
@@ -336,16 +372,30 @@ async function streamStep(step, message) {
336
372
  return null;
337
373
  }
338
374
  function writeStream(step) {
339
- const batchSize = 1024 * 1024; // 1MB;
340
375
  const startTransferOnce = _class_private_field_loose_base(this, _startStepOnce)[_startStepOnce](step);
341
376
  let batch = [];
377
+ let batchStartedAt = 0;
342
378
  const batchLength = ()=>jsonLength(batch);
379
+ const flushBatch = async ()=>{
380
+ if (batch.length === 0) {
381
+ return null;
382
+ }
383
+ const payload = batch;
384
+ batch = [];
385
+ batchStartedAt = 0;
386
+ return _class_private_field_loose_base(this, _streamStep)[_streamStep](step, payload);
387
+ };
388
+ const shouldFlushBatchAfterPush = ()=>{
389
+ if (batch.length === 0) {
390
+ return false;
391
+ }
392
+ return batchLength() >= STREAM_STEP_MAX_BATCH_BYTES || batch.length >= STREAM_STEP_MAX_BATCH_ITEMS || Date.now() - batchStartedAt >= STREAM_STEP_MAX_BATCH_AGE_MS;
393
+ };
343
394
  return new stream.Writable({
344
395
  objectMode: true,
345
396
  final: async (callback)=>{
346
397
  if (batch.length > 0) {
347
- const streamError = await _class_private_field_loose_base(this, _streamStep)[_streamStep](step, batch);
348
- batch = [];
398
+ const streamError = await flushBatch();
349
399
  if (streamError) {
350
400
  return callback(streamError);
351
401
  }
@@ -357,15 +407,24 @@ function writeStream(step) {
357
407
  }
358
408
  callback(error);
359
409
  },
360
- write: async (chunk, _encoding, callback)=>{
410
+ async write (chunk, _encoding, callback) {
361
411
  const startError = await startTransferOnce();
362
412
  if (startError) {
363
413
  return callback(startError);
364
414
  }
415
+ // Flush a batch that has sat long enough before growing it further (bounded latency).
416
+ if (batch.length > 0 && Date.now() - batchStartedAt >= STREAM_STEP_MAX_BATCH_AGE_MS) {
417
+ const staleError = await flushBatch();
418
+ if (staleError) {
419
+ return callback(staleError);
420
+ }
421
+ }
365
422
  batch.push(chunk);
366
- if (batchLength() >= batchSize) {
367
- const streamError = await _class_private_field_loose_base(this, _streamStep)[_streamStep](step, batch);
368
- batch = [];
423
+ if (batch.length === 1) {
424
+ batchStartedAt = Date.now();
425
+ }
426
+ if (shouldFlushBatchAfterPush()) {
427
+ const streamError = await flushBatch();
369
428
  if (streamError) {
370
429
  return callback(streamError);
371
430
  }
@@ -384,6 +443,16 @@ function reportInfo(message) {
384
443
  kind: 'info'
385
444
  });
386
445
  }
446
+ function reportWarning(message) {
447
+ _class_private_field_loose_base(this, _diagnostics)[_diagnostics]?.report({
448
+ details: {
449
+ createdAt: new Date(),
450
+ message,
451
+ origin: 'remote-destination-provider'
452
+ },
453
+ kind: 'warning'
454
+ });
455
+ }
387
456
  const createRemoteStrapiDestinationProvider = (options)=>{
388
457
  return new RemoteStrapiDestinationProvider(options);
389
458
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../src/strapi/providers/remote-destination/index.ts"],"sourcesContent":["import { randomUUID } from 'crypto';\nimport { Writable } from 'stream';\nimport { WebSocket } from 'ws';\nimport { once } from 'lodash/fp';\nimport type { Struct, Utils } from '@strapi/types';\n\nimport { createDispatcher, connectToWebsocket, trimTrailingSlash } from '../utils';\n\nimport type {\n IDestinationProvider,\n IMetadata,\n ProviderType,\n IAsset,\n TransferStage,\n Protocol,\n} from '../../../../types';\nimport type { IDiagnosticReporter } from '../../../utils/diagnostic';\nimport type { Client, Server, Auth } from '../../../../types/remote/protocol';\nimport type { ILocalStrapiDestinationProviderOptions } from '../local-destination';\nimport { TRANSFER_PATH } from '../../remote/constants';\nimport { ProviderTransferError, ProviderValidationError } from '../../../errors/providers';\n\nexport interface IRemoteStrapiDestinationProviderOptions\n extends Pick<ILocalStrapiDestinationProviderOptions, 'restore' | 'strategy'> {\n url: URL; // the url of the remote Strapi admin\n auth?: Auth.ITransferTokenAuth;\n retryMessageOptions?: {\n retryMessageTimeout: number; // milliseconds to wait for a response from a message\n retryMessageMaxRetries: number; // max number of retries for a message before aborting transfer\n };\n}\n\nconst jsonLength = (obj: object) => Buffer.byteLength(JSON.stringify(obj));\n\nclass RemoteStrapiDestinationProvider implements IDestinationProvider {\n name = 'destination::remote-strapi';\n\n type: ProviderType = 'destination';\n\n options: IRemoteStrapiDestinationProviderOptions;\n\n ws: WebSocket | null;\n\n dispatcher: ReturnType<typeof createDispatcher> | null;\n\n transferID: string | null;\n\n stats!: { [TStage in Exclude<TransferStage, 'schemas'>]: { count: number } };\n\n #diagnostics?: IDiagnosticReporter;\n\n constructor(options: IRemoteStrapiDestinationProviderOptions) {\n this.options = options;\n this.ws = null;\n this.dispatcher = null;\n this.transferID = null;\n\n this.resetStats();\n }\n\n private resetStats() {\n this.stats = {\n assets: { count: 0 },\n entities: { count: 0 },\n links: { count: 0 },\n configuration: { count: 0 },\n };\n }\n\n async initTransfer(): Promise<string> {\n const { strategy, restore } = this.options;\n\n const query = this.dispatcher?.dispatchCommand({\n command: 'init',\n params: { options: { strategy, restore }, transfer: 'push' },\n });\n\n const res = (await query) as Server.Payload<Server.InitMessage>;\n if (!res?.transferID) {\n throw new ProviderTransferError('Init failed, invalid response from the server');\n }\n\n this.resetStats();\n\n return res.transferID;\n }\n\n #startStepOnce(stage: Client.TransferPushStep) {\n return once(() => this.#startStep(stage));\n }\n\n async #startStep<T extends Client.TransferPushStep>(step: T) {\n try {\n await this.dispatcher?.dispatchTransferStep({ action: 'start', step });\n } catch (e) {\n if (e instanceof Error) {\n return e;\n }\n\n if (typeof e === 'string') {\n return new ProviderTransferError(e);\n }\n\n return new ProviderTransferError('Unexpected error');\n }\n\n this.stats[step] = { count: 0 };\n\n return null;\n }\n\n async #endStep<T extends Client.TransferPushStep>(step: T) {\n try {\n const res = await this.dispatcher?.dispatchTransferStep<{\n ok: boolean;\n stats: Protocol.Client.Stats;\n }>({\n action: 'end',\n step,\n });\n\n return { stats: res?.stats ?? null, error: null };\n } catch (e) {\n if (e instanceof Error) {\n return { stats: null, error: e };\n }\n\n if (typeof e === 'string') {\n return { stats: null, error: new ProviderTransferError(e) };\n }\n\n return { stats: null, error: new ProviderTransferError('Unexpected error') };\n }\n }\n\n async #streamStep<T extends Client.TransferPushStep>(\n step: T,\n message: Client.GetTransferPushStreamData<T>\n ) {\n try {\n if (step === 'assets') {\n const assetMessage = message as Protocol.Client.TransferAssetFlow[];\n this.stats[step].count += assetMessage.filter((data) => data.action === 'start').length;\n } else {\n this.stats[step].count += message.length;\n }\n\n await this.dispatcher?.dispatchTransferStep({ action: 'stream', step, data: message });\n } catch (e) {\n if (e instanceof Error) {\n return e;\n }\n\n if (typeof e === 'string') {\n return new ProviderTransferError(e);\n }\n\n return new ProviderTransferError('Unexpected error');\n }\n\n return null;\n }\n\n #writeStream(step: Exclude<Client.TransferPushStep, 'assets'>): Writable {\n type Step = typeof step;\n\n const batchSize = 1024 * 1024; // 1MB;\n const startTransferOnce = this.#startStepOnce(step);\n\n let batch = [] as Client.GetTransferPushStreamData<Step>;\n\n const batchLength = () => jsonLength(batch);\n\n return new Writable({\n objectMode: true,\n\n final: async (callback) => {\n if (batch.length > 0) {\n const streamError = await this.#streamStep(step, batch);\n\n batch = [];\n\n if (streamError) {\n return callback(streamError);\n }\n }\n const { error, stats } = await this.#endStep(step);\n\n const { count } = this.stats[step];\n\n if (stats && (stats.started !== count || stats.finished !== count)) {\n callback(\n new Error(\n `Data missing: sent ${this.stats[step].count} ${step}, received ${stats.started} and saved ${stats.finished} ${step}`\n )\n );\n }\n\n callback(error);\n },\n\n write: async (chunk, _encoding, callback) => {\n const startError = await startTransferOnce();\n if (startError) {\n return callback(startError);\n }\n\n batch.push(chunk);\n\n if (batchLength() >= batchSize) {\n const streamError = await this.#streamStep(step, batch);\n\n batch = [];\n\n if (streamError) {\n return callback(streamError);\n }\n }\n\n callback();\n },\n });\n }\n\n #reportInfo(message: string) {\n this.#diagnostics?.report({\n details: {\n createdAt: new Date(),\n message,\n origin: 'remote-destination-provider',\n },\n kind: 'info',\n });\n }\n\n async bootstrap(diagnostics?: IDiagnosticReporter): Promise<void> {\n this.#diagnostics = diagnostics;\n const { url, auth } = this.options;\n const validProtocols = ['https:', 'http:'];\n\n let ws: WebSocket;\n\n if (!validProtocols.includes(url.protocol)) {\n throw new ProviderValidationError(`Invalid protocol \"${url.protocol}\"`, {\n check: 'url',\n details: {\n protocol: url.protocol,\n validProtocols,\n },\n });\n }\n const wsProtocol = url.protocol === 'https:' ? 'wss:' : 'ws:';\n const wsUrl = `${wsProtocol}//${url.host}${trimTrailingSlash(\n url.pathname\n )}${TRANSFER_PATH}/push`;\n\n this.#reportInfo('establishing websocket connection');\n // No auth defined, trying public access for transfer\n if (!auth) {\n ws = await connectToWebsocket(wsUrl, undefined, this.#diagnostics);\n }\n\n // Common token auth, this should be the main auth method\n else if (auth.type === 'token') {\n const headers = { Authorization: `Bearer ${auth.token}` };\n ws = await connectToWebsocket(wsUrl, { headers }, this.#diagnostics);\n }\n\n // Invalid auth method provided\n else {\n throw new ProviderValidationError('Auth method not available', {\n check: 'auth.type',\n details: {\n auth: auth.type,\n },\n });\n }\n\n this.#reportInfo('established websocket connection');\n\n this.ws = ws;\n const { retryMessageOptions } = this.options;\n\n this.#reportInfo('creating dispatcher');\n this.dispatcher = createDispatcher(this.ws, retryMessageOptions, (message: string) =>\n this.#reportInfo(message)\n );\n this.#reportInfo('created dispatcher');\n\n this.#reportInfo('initialize transfer');\n this.transferID = await this.initTransfer();\n this.#reportInfo(`initialized transfer ${this.transferID}`);\n\n this.dispatcher.setTransferProperties({ id: this.transferID, kind: 'push' });\n\n await this.dispatcher.dispatchTransferAction('bootstrap');\n }\n\n async close() {\n // Gracefully close the remote transfer process\n if (this.transferID && this.dispatcher) {\n await this.dispatcher.dispatchTransferAction('close');\n\n await this.dispatcher.dispatchCommand({\n command: 'end',\n params: { transferID: this.transferID },\n });\n }\n\n await new Promise<void>((resolve) => {\n const { ws } = this;\n\n if (!ws || ws.CLOSED) {\n resolve();\n return;\n }\n\n ws.on('close', () => resolve()).close();\n });\n }\n\n getMetadata() {\n return this.dispatcher?.dispatchTransferAction<IMetadata>('getMetadata') ?? null;\n }\n\n async beforeTransfer() {\n await this.dispatcher?.dispatchTransferAction('beforeTransfer');\n }\n\n async rollback() {\n await this.dispatcher?.dispatchTransferAction('rollback');\n }\n\n getSchemas() {\n if (!this.dispatcher) {\n return Promise.resolve(null);\n }\n\n return this.dispatcher.dispatchTransferAction<Utils.String.Dict<Struct.Schema>>('getSchemas');\n }\n\n createEntitiesWriteStream(): Writable {\n return this.#writeStream('entities');\n }\n\n createLinksWriteStream(): Writable {\n return this.#writeStream('links');\n }\n\n createConfigurationWriteStream(): Writable {\n return this.#writeStream('configuration');\n }\n\n createAssetsWriteStream(): Writable | Promise<Writable> {\n let batch: Client.TransferAssetFlow[] = [];\n let hasStarted = false;\n\n const batchSize = 1024 * 1024; // 1MB;\n const batchLength = () => {\n return batch.reduce(\n (acc, chunk) => (chunk.action === 'stream' ? acc + chunk.data.byteLength : acc),\n 0\n );\n };\n const startAssetsTransferOnce = this.#startStepOnce('assets');\n\n const flush = async () => {\n const streamError = await this.#streamStep('assets', batch);\n batch = [];\n return streamError;\n };\n\n const safePush = async (chunk: Client.TransferAssetFlow) => {\n batch.push(chunk);\n\n if (batchLength() >= batchSize) {\n const streamError = await flush();\n if (streamError) {\n throw streamError;\n }\n }\n };\n\n return new Writable({\n objectMode: true,\n final: async (callback) => {\n if (batch.length > 0) {\n await flush();\n }\n\n if (hasStarted) {\n const { error: endStepError } = await this.#endStep('assets');\n\n if (endStepError) {\n return callback(endStepError);\n }\n }\n\n return callback(null);\n },\n\n async write(asset: IAsset, _encoding, callback) {\n const startError = await startAssetsTransferOnce();\n if (startError) {\n return callback(startError);\n }\n\n hasStarted = true;\n\n const assetID = randomUUID();\n const { filename, filepath, stats, stream, metadata } = asset;\n\n try {\n await safePush({\n action: 'start',\n assetID,\n data: { filename, filepath, stats, metadata },\n });\n\n for await (const chunk of stream) {\n await safePush({ action: 'stream', assetID, data: chunk });\n }\n\n await safePush({ action: 'end', assetID });\n\n callback();\n } catch (error) {\n if (error instanceof Error) {\n callback(error);\n }\n }\n },\n });\n }\n}\n\nexport const createRemoteStrapiDestinationProvider = (\n options: IRemoteStrapiDestinationProviderOptions\n) => {\n return new RemoteStrapiDestinationProvider(options);\n};\n"],"names":["jsonLength","obj","Buffer","byteLength","JSON","stringify","RemoteStrapiDestinationProvider","resetStats","stats","assets","count","entities","links","configuration","initTransfer","strategy","restore","options","query","dispatcher","dispatchCommand","command","params","transfer","res","transferID","ProviderTransferError","bootstrap","diagnostics","url","auth","validProtocols","ws","includes","protocol","ProviderValidationError","check","details","wsProtocol","wsUrl","host","trimTrailingSlash","pathname","TRANSFER_PATH","connectToWebsocket","undefined","type","headers","Authorization","token","retryMessageOptions","createDispatcher","message","setTransferProperties","id","kind","dispatchTransferAction","close","Promise","resolve","CLOSED","on","getMetadata","beforeTransfer","rollback","getSchemas","createEntitiesWriteStream","createLinksWriteStream","createConfigurationWriteStream","createAssetsWriteStream","batch","hasStarted","batchSize","batchLength","reduce","acc","chunk","action","data","startAssetsTransferOnce","flush","streamError","safePush","push","Writable","objectMode","final","callback","length","error","endStepError","write","asset","_encoding","startError","assetID","randomUUID","filename","filepath","stream","metadata","Error","name","stage","once","step","dispatchTransferStep","e","assetMessage","filter","startTransferOnce","started","finished","report","createdAt","Date","origin","createRemoteStrapiDestinationProvider"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../../src/strapi/providers/remote-destination/index.ts"],"sourcesContent":["import { createHash, randomUUID } from 'crypto';\nimport { Writable } from 'stream';\nimport { WebSocket } from 'ws';\nimport { once } from 'lodash/fp';\nimport type { Struct, Utils } from '@strapi/types';\n\nimport { createDispatcher, connectToWebsocket, trimTrailingSlash } from '../utils';\n\nimport type {\n IDestinationProvider,\n IMetadata,\n ProviderType,\n IAsset,\n TransferStage,\n Protocol,\n} from '../../../../types';\nimport type { IDiagnosticReporter } from '../../../utils/diagnostic';\nimport type { Client, Server, Auth } from '../../../../types/remote/protocol';\nimport type { ILocalStrapiDestinationProviderOptions } from '../local-destination';\nimport { TRANSFER_PATH } from '../../remote/constants';\nimport { ProviderTransferError, ProviderValidationError } from '../../../errors/providers';\nimport {\n createTransferAssetStreamChunk,\n transferAssetStreamChunkByteLength,\n} from '../../../utils/transfer-asset-chunk';\n\nexport interface IRemoteStrapiDestinationProviderOptions\n extends Pick<ILocalStrapiDestinationProviderOptions, 'restore' | 'strategy' | 'onTransferPhase'> {\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 /** Include per-asset stream checksums and require peers to validate on receive. */\n verifyChecksums?: boolean;\n}\n\nconst jsonLength = (obj: object) => Buffer.byteLength(JSON.stringify(obj));\n\n/**\n * Default batching for entities / links / configuration over WebSocket push.\n *\n * Goals: (1) enough payload per round-trip to stay efficient on large transfers,\n * (2) small enough per message that the remote can process and ack without multi-minute stalls,\n * (3) bounded gap between engine progress and the wire (see item cap + age).\n *\n * These are fixed defaults (not tuned per dataset) so behavior is predictable everywhere.\n */\nconst STREAM_STEP_MAX_BATCH_BYTES = 512 * 1024;\n\n/** Caps parallel work per message and how far UI count can lead the network for tiny rows. */\nconst STREAM_STEP_MAX_BATCH_ITEMS = 100;\n\n/**\n * If the first row in the current batch has waited this long, flush before appending more.\n * Helps mixed-size streams (e.g. occasional large rows) without relying on tiny byte caps alone.\n */\nconst STREAM_STEP_MAX_BATCH_AGE_MS = 450;\n\nclass RemoteStrapiDestinationProvider implements IDestinationProvider {\n name = 'destination::remote-strapi';\n\n type: ProviderType = 'destination';\n\n options: IRemoteStrapiDestinationProviderOptions;\n\n ws: WebSocket | null;\n\n dispatcher: ReturnType<typeof createDispatcher> | null;\n\n transferID: string | null;\n\n stats!: { [TStage in Exclude<TransferStage, 'schemas'>]: { count: number } };\n\n #diagnostics?: IDiagnosticReporter;\n\n #checksumsEnabled = false;\n\n constructor(options: IRemoteStrapiDestinationProviderOptions) {\n this.options = options;\n this.ws = null;\n this.dispatcher = null;\n this.transferID = null;\n this.#checksumsEnabled = options.verifyChecksums === true;\n\n this.resetStats();\n }\n\n private resetStats() {\n this.stats = {\n assets: { count: 0 },\n entities: { count: 0 },\n links: { count: 0 },\n configuration: { count: 0 },\n };\n }\n\n async initTransfer(): Promise<string> {\n const { strategy, restore } = this.options;\n const wantsChecksums = this.options.verifyChecksums === true;\n\n const query = this.dispatcher?.dispatchCommand({\n command: 'init',\n params: {\n options: { strategy, restore },\n transfer: 'push',\n ...(wantsChecksums ? { checksums: true } : {}),\n },\n });\n\n const res = (await query) as\n | (Server.Payload<Server.InitMessage> & { checksums?: boolean })\n | null;\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][push] Checksums were requested but the remote does not support checksum negotiation; continuing without checksum validation.'\n );\n }\n\n this.resetStats();\n\n return res.transferID;\n }\n\n #startStepOnce(stage: Client.TransferPushStep) {\n return once(() => this.#startStep(stage));\n }\n\n async #startStep<T extends Client.TransferPushStep>(step: T) {\n try {\n await this.dispatcher?.dispatchTransferStep({ action: 'start', step });\n } catch (e) {\n if (e instanceof Error) {\n return e;\n }\n\n if (typeof e === 'string') {\n return new ProviderTransferError(e);\n }\n\n return new ProviderTransferError('Unexpected error');\n }\n\n this.stats[step] = { count: 0 };\n\n return null;\n }\n\n async #endStep<T extends Client.TransferPushStep>(step: T) {\n try {\n const res = await this.dispatcher?.dispatchTransferStep<{\n ok: boolean;\n stats: Protocol.Client.Stats;\n }>({\n action: 'end',\n step,\n });\n\n return { stats: res?.stats ?? null, error: null };\n } catch (e) {\n if (e instanceof Error) {\n return { stats: null, error: e };\n }\n\n if (typeof e === 'string') {\n return { stats: null, error: new ProviderTransferError(e) };\n }\n\n return { stats: null, error: new ProviderTransferError('Unexpected error') };\n }\n }\n\n async #streamStep<T extends Client.TransferPushStep>(\n step: T,\n message: Client.GetTransferPushStreamData<T>\n ) {\n try {\n if (step === 'assets') {\n const assetMessage = message as Protocol.Client.TransferAssetFlow[];\n this.stats[step].count += assetMessage.filter((data) => data.action === 'start').length;\n } else {\n this.stats[step].count += message.length;\n }\n\n await this.dispatcher?.dispatchTransferStep({ action: 'stream', step, data: message });\n } catch (e) {\n if (e instanceof Error) {\n return e;\n }\n\n if (typeof e === 'string') {\n return new ProviderTransferError(e);\n }\n\n return new ProviderTransferError('Unexpected error');\n }\n\n return null;\n }\n\n #writeStream(step: Exclude<Client.TransferPushStep, 'assets'>): Writable {\n type Step = typeof step;\n\n const startTransferOnce = this.#startStepOnce(step);\n\n let batch = [] as Client.GetTransferPushStreamData<Step>;\n let batchStartedAt = 0;\n\n const batchLength = () => jsonLength(batch);\n\n const flushBatch = async (): Promise<Error | null> => {\n if (batch.length === 0) {\n return null;\n }\n const payload = batch;\n batch = [];\n batchStartedAt = 0;\n return this.#streamStep(step, payload);\n };\n\n const shouldFlushBatchAfterPush = () => {\n if (batch.length === 0) {\n return false;\n }\n return (\n batchLength() >= STREAM_STEP_MAX_BATCH_BYTES ||\n batch.length >= STREAM_STEP_MAX_BATCH_ITEMS ||\n Date.now() - batchStartedAt >= STREAM_STEP_MAX_BATCH_AGE_MS\n );\n };\n\n return new Writable({\n objectMode: true,\n\n final: async (callback) => {\n if (batch.length > 0) {\n const streamError = await flushBatch();\n\n if (streamError) {\n return callback(streamError);\n }\n }\n const { error, stats } = await this.#endStep(step);\n\n const { count } = this.stats[step];\n\n if (stats && (stats.started !== count || stats.finished !== count)) {\n callback(\n new Error(\n `Data missing: sent ${this.stats[step].count} ${step}, received ${stats.started} and saved ${stats.finished} ${step}`\n )\n );\n }\n\n callback(error);\n },\n\n async write(chunk, _encoding, callback) {\n const startError = await startTransferOnce();\n if (startError) {\n return callback(startError);\n }\n\n // Flush a batch that has sat long enough before growing it further (bounded latency).\n if (batch.length > 0 && Date.now() - batchStartedAt >= STREAM_STEP_MAX_BATCH_AGE_MS) {\n const staleError = await flushBatch();\n if (staleError) {\n return callback(staleError);\n }\n }\n\n batch.push(chunk);\n if (batch.length === 1) {\n batchStartedAt = Date.now();\n }\n\n if (shouldFlushBatchAfterPush()) {\n const streamError = await flushBatch();\n if (streamError) {\n return callback(streamError);\n }\n }\n\n callback();\n },\n });\n }\n\n #reportInfo(message: string) {\n this.#diagnostics?.report({\n details: {\n createdAt: new Date(),\n message,\n origin: 'remote-destination-provider',\n },\n kind: 'info',\n });\n }\n\n #reportWarning(message: string) {\n this.#diagnostics?.report({\n details: {\n createdAt: new Date(),\n message,\n origin: 'remote-destination-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 const validProtocols = ['https:', 'http:'];\n\n let ws: WebSocket;\n\n if (!validProtocols.includes(url.protocol)) {\n throw new ProviderValidationError(`Invalid protocol \"${url.protocol}\"`, {\n check: 'url',\n details: {\n protocol: url.protocol,\n validProtocols,\n },\n });\n }\n const wsProtocol = url.protocol === 'https:' ? 'wss:' : 'ws:';\n const wsUrl = `${wsProtocol}//${url.host}${trimTrailingSlash(\n url.pathname\n )}${TRANSFER_PATH}/push`;\n\n this.#reportInfo('establishing websocket connection');\n // No auth defined, trying public access for transfer\n if (!auth) {\n ws = await connectToWebsocket(wsUrl, undefined, this.#diagnostics);\n }\n\n // Common token auth, this should be the main auth method\n else if (auth.type === 'token') {\n const headers = { Authorization: `Bearer ${auth.token}` };\n ws = await connectToWebsocket(wsUrl, { headers }, this.#diagnostics);\n }\n\n // Invalid auth method provided\n else {\n throw new ProviderValidationError('Auth method not available', {\n check: 'auth.type',\n details: {\n auth: auth.type,\n },\n });\n }\n\n this.#reportInfo('established websocket connection');\n\n this.ws = ws;\n const { retryMessageOptions } = this.options;\n\n this.#reportInfo('creating dispatcher');\n this.dispatcher = createDispatcher(this.ws, retryMessageOptions, (message: string) =>\n this.#reportInfo(message)\n );\n this.#reportInfo('created dispatcher');\n\n this.#reportInfo('initialize transfer');\n this.transferID = await this.initTransfer();\n this.#reportInfo(`initialized transfer ${this.transferID}`);\n\n this.dispatcher.setTransferProperties({ id: this.transferID, kind: 'push' });\n\n await this.dispatcher.dispatchTransferAction('bootstrap');\n }\n\n async close() {\n // Gracefully close the remote transfer process\n if (this.transferID && this.dispatcher) {\n await this.dispatcher.dispatchTransferAction('close');\n\n await this.dispatcher.dispatchCommand({\n command: 'end',\n params: { transferID: this.transferID },\n });\n }\n\n await new Promise<void>((resolve) => {\n const { ws } = this;\n\n if (!ws || ws.CLOSED) {\n resolve();\n return;\n }\n\n ws.on('close', () => resolve()).close();\n });\n }\n\n getMetadata() {\n return this.dispatcher?.dispatchTransferAction<IMetadata>('getMetadata') ?? null;\n }\n\n async beforeTransfer() {\n this.options.onTransferPhase?.(\n 'Remote: waiting for server to clear data and prepare destination…'\n );\n await this.dispatcher?.dispatchTransferAction('beforeTransfer');\n }\n\n async rollback() {\n await this.dispatcher?.dispatchTransferAction('rollback');\n }\n\n getSchemas() {\n if (!this.dispatcher) {\n return Promise.resolve(null);\n }\n\n return this.dispatcher.dispatchTransferAction<Utils.String.Dict<Struct.Schema>>('getSchemas');\n }\n\n createEntitiesWriteStream(): Writable {\n return this.#writeStream('entities');\n }\n\n createLinksWriteStream(): Writable {\n return this.#writeStream('links');\n }\n\n createConfigurationWriteStream(): Writable {\n return this.#writeStream('configuration');\n }\n\n createAssetsWriteStream(): Writable | Promise<Writable> {\n let batch: Client.TransferAssetFlow[] = [];\n let hasStarted = false;\n const verifyChecksums = this.#checksumsEnabled;\n\n const batchSize = 1024 * 1024; // 1MB;\n const batchLength = () => {\n return batch.reduce((acc, chunk) => acc + transferAssetStreamChunkByteLength(chunk), 0);\n };\n const startAssetsTransferOnce = this.#startStepOnce('assets');\n\n const flush = async () => {\n const streamError = await this.#streamStep('assets', batch);\n batch = [];\n return streamError;\n };\n\n const safePush = async (chunk: Client.TransferAssetFlow) => {\n batch.push(chunk);\n\n if (batchLength() >= batchSize) {\n const streamError = await flush();\n if (streamError) {\n throw streamError;\n }\n }\n };\n\n return new Writable({\n objectMode: true,\n final: async (callback) => {\n if (batch.length > 0) {\n await flush();\n }\n\n if (hasStarted) {\n const { error: endStepError } = await this.#endStep('assets');\n\n if (endStepError) {\n return callback(endStepError);\n }\n }\n\n return callback(null);\n },\n\n async write(asset: IAsset, _encoding, callback) {\n const startError = await startAssetsTransferOnce();\n if (startError) {\n return callback(startError);\n }\n\n hasStarted = true;\n\n const assetID = randomUUID();\n const { filename, filepath, stats, stream, metadata } = asset;\n const checksumHash = verifyChecksums ? createHash('sha256') : undefined;\n\n try {\n await safePush({\n action: 'start',\n assetID,\n data: { filename, filepath, stats, metadata },\n });\n\n for await (const chunk of stream) {\n checksumHash?.update(chunk);\n await safePush(createTransferAssetStreamChunk(assetID, chunk));\n }\n\n await safePush({\n action: 'end',\n assetID,\n ...(checksumHash\n ? { checksum: { algorithm: 'sha256' as const, value: checksumHash.digest('hex') } }\n : {}),\n });\n\n callback();\n } catch (error) {\n callback(error instanceof Error ? error : new Error(String(error)));\n }\n },\n });\n }\n}\n\nexport const createRemoteStrapiDestinationProvider = (\n options: IRemoteStrapiDestinationProviderOptions\n) => {\n return new RemoteStrapiDestinationProvider(options);\n};\n"],"names":["jsonLength","obj","Buffer","byteLength","JSON","stringify","STREAM_STEP_MAX_BATCH_BYTES","STREAM_STEP_MAX_BATCH_ITEMS","STREAM_STEP_MAX_BATCH_AGE_MS","RemoteStrapiDestinationProvider","resetStats","stats","assets","count","entities","links","configuration","initTransfer","strategy","restore","options","wantsChecksums","verifyChecksums","query","dispatcher","dispatchCommand","command","params","transfer","checksums","res","transferID","ProviderTransferError","bootstrap","diagnostics","url","auth","validProtocols","ws","includes","protocol","ProviderValidationError","check","details","wsProtocol","wsUrl","host","trimTrailingSlash","pathname","TRANSFER_PATH","connectToWebsocket","undefined","type","headers","Authorization","token","retryMessageOptions","createDispatcher","message","setTransferProperties","id","kind","dispatchTransferAction","close","Promise","resolve","CLOSED","on","getMetadata","beforeTransfer","onTransferPhase","rollback","getSchemas","createEntitiesWriteStream","createLinksWriteStream","createConfigurationWriteStream","createAssetsWriteStream","batch","hasStarted","batchSize","batchLength","reduce","acc","chunk","transferAssetStreamChunkByteLength","startAssetsTransferOnce","flush","streamError","safePush","push","Writable","objectMode","final","callback","length","error","endStepError","write","asset","_encoding","startError","assetID","randomUUID","filename","filepath","stream","metadata","checksumHash","createHash","action","data","update","createTransferAssetStreamChunk","checksum","algorithm","value","digest","Error","String","name","stage","once","step","dispatchTransferStep","e","assetMessage","filter","startTransferOnce","batchStartedAt","flushBatch","payload","shouldFlushBatchAfterPush","Date","now","started","finished","staleError","report","createdAt","origin","createRemoteStrapiDestinationProvider"],"mappings":"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"}