@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,7 +1,10 @@
1
- import { PassThrough } from 'stream';
1
+ import { createHash } from 'crypto';
2
+ import { PassThrough, Writable } from 'stream';
2
3
  import { castArray } from 'lodash/fp';
3
4
  import { ProviderValidationError, ProviderTransferError } from '../../../errors/providers.mjs';
4
5
  import { TRANSFER_PATH } from '../../remote/constants.mjs';
6
+ import { decodeTransferAssetStreamItem } from '../../../utils/transfer-asset-chunk.mjs';
7
+ import { write } from '../../../utils/writable-async-write.mjs';
5
8
  import { trimTrailingSlash, connectToWebsocket, createDispatcher } from '../utils.mjs';
6
9
 
7
10
  function _class_private_field_loose_base(receiver, privateKey) {
@@ -14,7 +17,15 @@ var id = 0;
14
17
  function _class_private_field_loose_key(name) {
15
18
  return "__private_" + id++ + "_" + name;
16
19
  }
17
- var _diagnostics = /*#__PURE__*/ _class_private_field_loose_key("_diagnostics"), _createStageReadStream = /*#__PURE__*/ _class_private_field_loose_key("_createStageReadStream"), _reportInfo = /*#__PURE__*/ _class_private_field_loose_key("_reportInfo"), _startStep = /*#__PURE__*/ _class_private_field_loose_key("_startStep"), _respond = /*#__PURE__*/ _class_private_field_loose_key("_respond"), _endStep = /*#__PURE__*/ _class_private_field_loose_key("_endStep");
20
+ /**
21
+ * Pull server answers `assets` step `start` only after `estimateAssetTotals` (DB stream; remote sizes from DB when complete, else HTTP like `createAssetsStream`).
22
+ * That can exceed the default dispatcher wait (~30s between resends, a few minutes total). This message
23
+ * uses a longer window so large libraries do not fail with `Request timed out` before totals are returned.
24
+ */ const ASSETS_START_RETRY_OVERRIDES = {
25
+ retryMessageTimeout: 120000,
26
+ retryMessageMaxRetries: 30
27
+ };
28
+ var _diagnostics = /*#__PURE__*/ _class_private_field_loose_key("_diagnostics"), _pullAssetStreamWireSampleLogged = /*#__PURE__*/ _class_private_field_loose_key("_pullAssetStreamWireSampleLogged"), _checksumsEnabled = /*#__PURE__*/ _class_private_field_loose_key("_checksumsEnabled"), /** Set from pull server `start` response for `assets` when present (for engine `getStageTotals`). */ _cachedAssetsTotals = /*#__PURE__*/ _class_private_field_loose_key("_cachedAssetsTotals"), _createStageReadStream = /*#__PURE__*/ _class_private_field_loose_key("_createStageReadStream"), _reportInfo = /*#__PURE__*/ _class_private_field_loose_key("_reportInfo"), /** Reports a warning diagnostic (`kind: 'warning'`). Consumers (e.g. CLI) choose log levels and routing. */ _reportWarning = /*#__PURE__*/ _class_private_field_loose_key("_reportWarning"), _startStep = /*#__PURE__*/ _class_private_field_loose_key("_startStep"), _respond = /*#__PURE__*/ _class_private_field_loose_key("_respond"), _endStep = /*#__PURE__*/ _class_private_field_loose_key("_endStep");
18
29
  class RemoteStrapiSourceProvider {
19
30
  createEntitiesReadStream() {
20
31
  return _class_private_field_loose_base(this, _createStageReadStream)[_createStageReadStream]('entities');
@@ -30,50 +41,71 @@ class RemoteStrapiSourceProvider {
30
41
  });
31
42
  // Init the asset map
32
43
  const assets = {};
33
- // Watch for stalled assets; if we don't receive a chunk within timeout, abort transfer
44
+ // Watch for stalled assets: no remote chunks and no completed writes to the asset stream for streamTimeout ms
34
45
  const resetTimeout = (assetID)=>{
46
+ if (!assets[assetID]) {
47
+ return;
48
+ }
35
49
  if (assets[assetID].timeout) {
36
50
  clearTimeout(assets[assetID].timeout);
37
51
  }
38
52
  assets[assetID].timeout = setTimeout(()=>{
53
+ if (!assets[assetID]) {
54
+ return;
55
+ }
39
56
  _class_private_field_loose_base(this, _reportInfo)[_reportInfo](`Asset ${assetID} transfer stalled, aborting.`);
40
57
  assets[assetID].status = 'errored';
41
58
  assets[assetID].stream.destroy(new Error(`Asset ${assetID} transfer timed out`));
42
59
  }, this.options.streamTimeout);
43
60
  };
44
- stream/**
45
- * Process a payload of many transfer assets and performs the following tasks:
46
- * - Start: creates a stream for new assets.
47
- * - Stream: writes asset chunks to the asset's stream.
48
- * - End: closes the stream after the asset s transferred and cleanup related resources.
49
- */ .on('data', async (payload)=>{
61
+ const clearStallTimeoutForAsset = (assetID)=>{
62
+ const entry = assets[assetID];
63
+ if (entry?.timeout) {
64
+ clearTimeout(entry.timeout);
65
+ entry.timeout = undefined;
66
+ }
67
+ };
68
+ const clearAllStallTimeouts = ()=>{
69
+ for (const id of Object.keys(assets)){
70
+ clearStallTimeoutForAsset(id);
71
+ }
72
+ };
73
+ /**
74
+ * Serialize asset batch handling: `Readable.on('data', async …)` does not apply backpressure,
75
+ * so we pipe through a Writable with highWaterMark 1 so only one batch is in flight.
76
+ */ const processAssetPayload = async (payload)=>{
50
77
  for (const item of payload){
51
78
  const { action, assetID } = item;
52
- // Creates the stream to send the incoming asset through
53
79
  if (action === 'start') {
54
- // if a transfer has already been started for the same asset ID, something is wrong
55
80
  if (assets[assetID]) {
56
81
  throw new Error(`Asset ${assetID} already started`);
57
82
  }
58
83
  _class_private_field_loose_base(this, _reportInfo)[_reportInfo](`Asset ${assetID} starting`);
59
- // Register the asset
60
84
  assets[assetID] = {
61
85
  ...item.data,
62
86
  stream: new PassThrough(),
63
87
  status: 'ok',
64
- queue: []
88
+ queue: [],
89
+ ..._class_private_field_loose_base(this, _checksumsEnabled)[_checksumsEnabled] ? {
90
+ checksumHash: createHash('sha256')
91
+ } : {}
65
92
  };
66
93
  resetTimeout(assetID);
67
- // Connect the individual asset stream to the main asset stage stream
68
- // Note: nothing is transferred until data chunks are fed to the asset stream
69
- await this.writeAsync(pass, assets[assetID]);
94
+ await write(pass, assets[assetID]);
70
95
  } else if (action === 'stream' || action === 'end') {
71
- // If the asset hasn't been registered, or if it's been closed already, something is wrong
72
96
  if (!assets[assetID]) {
73
97
  throw new Error(`No id matching ${assetID} for stream action`);
74
98
  }
75
- // On every action, reset the timeout timer
76
99
  if (action === 'stream') {
100
+ if (!_class_private_field_loose_base(this, _pullAssetStreamWireSampleLogged)[_pullAssetStreamWireSampleLogged]) {
101
+ _class_private_field_loose_base(this, _pullAssetStreamWireSampleLogged)[_pullAssetStreamWireSampleLogged] = true;
102
+ const { data } = item;
103
+ // Same legacy shape `decodeTransferAssetStreamData` accepts after JSON.parse (proof, not frame-size guess).
104
+ const legacyBufferJson = data && typeof data === 'object' && !Buffer.isBuffer(data) && data.type === 'Buffer' && (Array.isArray(data.data) || ArrayBuffer.isView(data.data));
105
+ if (legacyBufferJson) {
106
+ _class_private_field_loose_base(this, _reportWarning)[_reportWarning]('[Data transfer][pull] Remote is using legacy Buffer JSON for asset chunks (each byte as a JSON number). That uses much more memory during JSON.parse than base64. Upgrade the remote Strapi to a version that sends base64 asset chunks, or out-of-memory errors may still happen on large files.');
107
+ }
108
+ }
77
109
  resetTimeout(assetID);
78
110
  } else {
79
111
  clearTimeout(assets[assetID].timeout);
@@ -84,8 +116,6 @@ class RemoteStrapiSourceProvider {
84
116
  assets[assetID].queue.push(item);
85
117
  }
86
118
  }
87
- // each new payload will start new processQueue calls, which may cause some extra calls
88
- // it's essentially saying "start processing this asset again, I added more data to the queue"
89
119
  for(const assetID in assets){
90
120
  if (Object.prototype.hasOwnProperty.call(assets, assetID)) {
91
121
  const asset = assets[assetID];
@@ -94,9 +124,37 @@ class RemoteStrapiSourceProvider {
94
124
  }
95
125
  }
96
126
  }
97
- }).on('close', ()=>{
98
- pass.end();
127
+ };
128
+ const processor = new Writable({
129
+ objectMode: true,
130
+ highWaterMark: 1,
131
+ write (payload, _encoding, callback) {
132
+ processAssetPayload(payload).then(()=>{
133
+ callback();
134
+ }, (err)=>{
135
+ clearAllStallTimeouts();
136
+ stream.destroy(err);
137
+ callback(err);
138
+ });
139
+ },
140
+ final (callback) {
141
+ pass.end();
142
+ callback();
143
+ }
144
+ });
145
+ processor.on('error', (err)=>{
146
+ clearAllStallTimeouts();
147
+ pass.destroy(err);
148
+ });
149
+ stream.on('error', (err)=>{
150
+ clearAllStallTimeouts();
151
+ processor.destroy(err);
152
+ pass.destroy(err);
99
153
  });
154
+ stream.once('end', ()=>{
155
+ clearAllStallTimeouts();
156
+ });
157
+ stream.pipe(processor);
100
158
  /**
101
159
  * Start processing the queue for a given assetID
102
160
  *
@@ -123,15 +181,20 @@ class RemoteStrapiSourceProvider {
123
181
  // if this is an end chunk, close the asset stream
124
182
  if (data.action === 'end') {
125
183
  _class_private_field_loose_base(this, _reportInfo)[_reportInfo](`Ending asset stream for ${id}`);
126
- await closeAssetStream(id);
184
+ await closeAssetStream(id, data.checksum);
127
185
  break; // Exit the loop after closing the stream
128
186
  }
129
187
  // Save the current chunk
130
188
  await writeChunkToStream(id, data);
131
- } catch {
189
+ } catch (error) {
132
190
  if (!assets[id]) {
133
191
  throw new Error(`No id matching ${id} for writeAssetChunk`);
134
192
  }
193
+ clearStallTimeoutForAsset(id);
194
+ if (error instanceof Error) {
195
+ throw error;
196
+ }
197
+ throw new Error(`Unexpected error while processing asset chunk for "${id}"`);
135
198
  }
136
199
  }
137
200
  };
@@ -139,30 +202,52 @@ class RemoteStrapiSourceProvider {
139
202
  * Writes a chunk of data to the asset's stream.
140
203
  *
141
204
  * Only check if the targeted asset exists, no other validation is done.
142
- */ const writeChunkToStream = async (id, data)=>{
205
+ */ const writeChunkToStream = async (id, item)=>{
143
206
  const asset = assets[id];
144
207
  if (!asset) {
145
208
  throw new Error(`Failed to write asset chunk for "${id}". Asset not found.`);
146
209
  }
147
- const rawBuffer = data;
148
- const chunk = Buffer.from(rawBuffer.data);
149
- await this.writeAsync(asset.stream, chunk);
210
+ if (item.action !== 'stream') {
211
+ throw new Error(`Expected stream queue item for "${id}"`);
212
+ }
213
+ const chunk = decodeTransferAssetStreamItem(item);
214
+ asset.checksumHash?.update(chunk);
215
+ await write(asset.stream, chunk);
216
+ // Count slow draining as progress so backpressure on large chunks does not trip the stall timer
217
+ resetTimeout(id);
150
218
  };
151
219
  /**
152
220
  * Closes the asset stream associated with the given ID.
153
221
  *
154
222
  * It deletes the stream for the asset upon successful closure.
155
- */ const closeAssetStream = async (id)=>{
223
+ */ const closeAssetStream = async (id, checksum)=>{
156
224
  if (!assets[id]) {
157
225
  throw new Error(`Failed to close asset "${id}". Asset not found.`);
158
226
  }
159
- assets[id].status = 'closed';
227
+ const asset = assets[id];
228
+ // The queue processes stream chunks before `end`; the last `writeChunkToStream` calls
229
+ // `resetTimeout` after the `end` chunk already cleared the timer — clear again before closing.
230
+ clearStallTimeoutForAsset(id);
231
+ if (_class_private_field_loose_base(this, _checksumsEnabled)[_checksumsEnabled]) {
232
+ if (!checksum) {
233
+ throw new ProviderTransferError(`Asset ${id} is missing checksum in transfer end payload`);
234
+ }
235
+ if (checksum.algorithm !== 'sha256') {
236
+ throw new ProviderTransferError(`Asset ${id} checksum algorithm "${checksum.algorithm}" is not supported`);
237
+ }
238
+ const actual = asset.checksumHash?.digest('hex');
239
+ if (!actual || actual !== checksum.value) {
240
+ throw new ProviderTransferError(`Checksum mismatch for asset "${id}" (expected ${checksum.value}, got ${actual ?? 'none'})`);
241
+ }
242
+ }
243
+ asset.status = 'closed';
160
244
  await new Promise((resolve, reject)=>{
161
- const { stream } = assets[id];
245
+ const { stream } = asset;
162
246
  stream.on('close', ()=>{
247
+ delete assets[id];
163
248
  resolve();
164
249
  }).on('error', (e)=>{
165
- assets[id].status = 'errored';
250
+ delete assets[id];
166
251
  reject(new Error(`Failed to close asset "${id}". Asset stream error: ${e.toString()}`));
167
252
  }).end();
168
253
  });
@@ -192,13 +277,24 @@ class RemoteStrapiSourceProvider {
192
277
  }
193
278
  }
194
279
  async initTransfer() {
280
+ const wantsChecksums = this.options.verifyChecksums === true;
195
281
  const query = this.dispatcher?.dispatchCommand({
196
- command: 'init'
282
+ command: 'init',
283
+ ...wantsChecksums ? {
284
+ params: {
285
+ transfer: 'pull',
286
+ checksums: true
287
+ }
288
+ } : {}
197
289
  });
198
290
  const res = await query;
199
291
  if (!res?.transferID) {
200
292
  throw new ProviderTransferError('Init failed, invalid response from the server');
201
293
  }
294
+ _class_private_field_loose_base(this, _checksumsEnabled)[_checksumsEnabled] = wantsChecksums && res.checksums === true;
295
+ if (wantsChecksums && res.checksums !== true) {
296
+ _class_private_field_loose_base(this, _reportWarning)[_reportWarning]('[Data transfer][pull] Checksums were requested but the remote does not support checksum negotiation; continuing without checksum validation.');
297
+ }
202
298
  return res.transferID;
203
299
  }
204
300
  async bootstrap(diagnostics) {
@@ -208,6 +304,7 @@ class RemoteStrapiSourceProvider {
208
304
  this.assertValidProtocol(url);
209
305
  const wsProtocol = url.protocol === 'https:' ? 'wss:' : 'ws:';
210
306
  const wsUrl = `${wsProtocol}//${url.host}${trimTrailingSlash(url.pathname)}${TRANSFER_PATH}/pull`;
307
+ _class_private_field_loose_base(this, _pullAssetStreamWireSampleLogged)[_pullAssetStreamWireSampleLogged] = false;
211
308
  _class_private_field_loose_base(this, _reportInfo)[_reportInfo]('establishing websocket connection');
212
309
  // No auth defined, trying public access for transfer
213
310
  if (!auth) {
@@ -232,7 +329,7 @@ class RemoteStrapiSourceProvider {
232
329
  const { retryMessageOptions } = this.options;
233
330
  _class_private_field_loose_base(this, _reportInfo)[_reportInfo]('creating dispatcher');
234
331
  this.dispatcher = createDispatcher(this.ws, retryMessageOptions, (message)=>_class_private_field_loose_base(this, _reportInfo)[_reportInfo](message));
235
- _class_private_field_loose_base(this, _reportInfo)[_reportInfo]('creating dispatcher');
332
+ _class_private_field_loose_base(this, _reportInfo)[_reportInfo]('created dispatcher');
236
333
  _class_private_field_loose_base(this, _reportInfo)[_reportInfo]('initialize transfer');
237
334
  const transferID = await this.initTransfer();
238
335
  _class_private_field_loose_base(this, _reportInfo)[_reportInfo](`initialized transfer ${transferID}`);
@@ -257,6 +354,13 @@ class RemoteStrapiSourceProvider {
257
354
  const schemas = await this.dispatcher?.dispatchTransferAction('getSchemas');
258
355
  return schemas ?? null;
259
356
  }
357
+ async getStageTotals(stage) {
358
+ if (stage !== 'assets') {
359
+ return null;
360
+ }
361
+ const cached = _class_private_field_loose_base(this, _cachedAssetsTotals)[_cachedAssetsTotals];
362
+ return cached ?? null;
363
+ }
260
364
  constructor(options){
261
365
  Object.defineProperty(this, _createStageReadStream, {
262
366
  value: createStageReadStream
@@ -264,6 +368,9 @@ class RemoteStrapiSourceProvider {
264
368
  Object.defineProperty(this, _reportInfo, {
265
369
  value: reportInfo
266
370
  });
371
+ Object.defineProperty(this, _reportWarning, {
372
+ value: reportWarning
373
+ });
267
374
  Object.defineProperty(this, _startStep, {
268
375
  value: startStep
269
376
  });
@@ -277,35 +384,50 @@ class RemoteStrapiSourceProvider {
277
384
  writable: true,
278
385
  value: void 0
279
386
  });
387
+ Object.defineProperty(this, _pullAssetStreamWireSampleLogged, {
388
+ writable: true,
389
+ value: void 0
390
+ });
391
+ Object.defineProperty(this, _checksumsEnabled, {
392
+ writable: true,
393
+ value: void 0
394
+ });
395
+ Object.defineProperty(this, _cachedAssetsTotals, {
396
+ writable: true,
397
+ value: void 0
398
+ });
280
399
  this.name = 'source::remote-strapi';
281
400
  this.type = 'source';
282
401
  this.defaultOptions = {
283
- streamTimeout: 15000
284
- };
285
- this.writeAsync = (stream, data)=>{
286
- return new Promise((resolve, reject)=>{
287
- stream.write(data, (error)=>{
288
- if (error) {
289
- reject(error);
290
- }
291
- resolve();
292
- });
293
- });
402
+ // Large files + JSON/WS backpressure can go minutes between *messages* while bytes still drain locally
403
+ streamTimeout: 300000
294
404
  };
405
+ _class_private_field_loose_base(this, _pullAssetStreamWireSampleLogged)[_pullAssetStreamWireSampleLogged] = false;
406
+ _class_private_field_loose_base(this, _checksumsEnabled)[_checksumsEnabled] = false;
295
407
  this.options = {
296
408
  ...this.defaultOptions,
297
409
  ...options
298
410
  };
411
+ _class_private_field_loose_base(this, _checksumsEnabled)[_checksumsEnabled] = this.options.verifyChecksums === true;
299
412
  this.ws = null;
300
413
  this.dispatcher = null;
301
414
  }
302
415
  }
303
416
  async function createStageReadStream(stage) {
417
+ if (stage === 'assets') {
418
+ _class_private_field_loose_base(this, _cachedAssetsTotals)[_cachedAssetsTotals] = undefined;
419
+ }
304
420
  const startResult = await _class_private_field_loose_base(this, _startStep)[_startStep](stage);
305
421
  if (startResult instanceof Error) {
306
422
  throw startResult;
307
423
  }
308
- const { id: processID } = startResult;
424
+ const { id: processID, totals } = startResult;
425
+ if (stage === 'assets' && totals && (totals.totalBytes != null || totals.totalCount != null)) {
426
+ _class_private_field_loose_base(this, _cachedAssetsTotals)[_cachedAssetsTotals] = totals;
427
+ }
428
+ // Default object-mode HWM (~16 chunks). Do not await `drain` on manual `push` while `pipe()`
429
+ // is attached — drain/`readableLength` races reliably deadlock after a few 1MiB asset frames.
430
+ // Backpressure for pull assets is enforced by the Writable below (`highWaterMark: 1`).
309
431
  const stream = new PassThrough({
310
432
  objectMode: true
311
433
  });
@@ -329,7 +451,6 @@ async function createStageReadStream(stage) {
329
451
  stream.end();
330
452
  return;
331
453
  }
332
- // if we get a single items instead of a batch
333
454
  for (const item of castArray(data)){
334
455
  stream.push(item);
335
456
  }
@@ -349,12 +470,24 @@ function reportInfo(message) {
349
470
  kind: 'info'
350
471
  });
351
472
  }
473
+ function reportWarning(message) {
474
+ _class_private_field_loose_base(this, _diagnostics)[_diagnostics]?.report({
475
+ details: {
476
+ createdAt: new Date(),
477
+ message,
478
+ origin: 'remote-source-provider'
479
+ },
480
+ kind: 'warning'
481
+ });
482
+ }
352
483
  async function startStep(step) {
353
484
  try {
354
485
  return await this.dispatcher?.dispatchTransferStep({
355
486
  action: 'start',
356
487
  step
357
- });
488
+ }, step === 'assets' ? {
489
+ retryOverrides: ASSETS_START_RETRY_OVERRIDES
490
+ } : undefined);
358
491
  } catch (e) {
359
492
  if (e instanceof Error) {
360
493
  return e;
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../../src/strapi/providers/remote-source/index.ts"],"sourcesContent":["import { PassThrough, Readable, Writable } from 'stream';\nimport type { Struct, Utils } from '@strapi/types';\nimport { WebSocket } from 'ws';\nimport { castArray } from 'lodash/fp';\n\nimport type {\n IAsset,\n IMetadata,\n ISourceProvider,\n ISourceProviderTransferResults,\n MaybePromise,\n Protocol,\n ProviderType,\n TransferStage,\n} from '../../../../types';\nimport type { IDiagnosticReporter } from '../../../utils/diagnostic';\nimport { Client, Server, Auth } from '../../../../types/remote/protocol';\nimport { ProviderTransferError, ProviderValidationError } from '../../../errors/providers';\nimport { TRANSFER_PATH } from '../../remote/constants';\nimport { ILocalStrapiSourceProviderOptions } from '../local-source';\nimport { createDispatcher, connectToWebsocket, trimTrailingSlash } from '../utils';\n\nexport interface IRemoteStrapiSourceProviderOptions extends ILocalStrapiSourceProviderOptions {\n url: URL; // the url of the remote Strapi admin\n auth?: Auth.ITransferTokenAuth;\n retryMessageOptions?: {\n retryMessageTimeout: number; // milliseconds to wait for a response from a message\n retryMessageMaxRetries: number; // max number of retries for a message before aborting transfer\n };\n streamTimeout?: number; // milliseconds to wait between chunks of an asset before aborting the transfer\n}\n\ntype QueueableAction = Protocol.Client.TransferAssetFlow &\n ({ action: 'stream' } | { action: 'end' });\n\nclass RemoteStrapiSourceProvider implements ISourceProvider {\n name = 'source::remote-strapi';\n\n type: ProviderType = 'source';\n\n options: IRemoteStrapiSourceProviderOptions;\n\n ws: WebSocket | null;\n\n dispatcher: ReturnType<typeof createDispatcher> | null;\n\n defaultOptions: Partial<IRemoteStrapiSourceProviderOptions> = {\n streamTimeout: 15000,\n };\n\n constructor(options: IRemoteStrapiSourceProviderOptions) {\n this.options = {\n ...this.defaultOptions,\n ...options,\n };\n\n this.ws = null;\n this.dispatcher = null;\n }\n\n results?: ISourceProviderTransferResults | undefined;\n\n #diagnostics?: IDiagnosticReporter;\n\n async #createStageReadStream(stage: Exclude<TransferStage, 'schemas'>) {\n const startResult = await this.#startStep(stage);\n\n if (startResult instanceof Error) {\n throw startResult;\n }\n\n const { id: processID } = startResult as { id: string };\n\n const stream = new PassThrough({ objectMode: true });\n\n const listener = async (raw: Buffer) => {\n const parsed = JSON.parse(raw.toString());\n // If not a message related to our transfer process, ignore it\n if (!parsed.uuid || parsed?.data?.type !== 'transfer' || parsed?.data?.id !== processID) {\n this.ws?.once('message', listener);\n return;\n }\n\n const { uuid, data: message } = parsed;\n const { ended, error, data } = message;\n\n if (error) {\n await this.#respond(uuid);\n stream.destroy(error);\n return;\n }\n\n if (ended) {\n await this.#respond(uuid);\n await this.#endStep(stage);\n\n stream.end();\n return;\n }\n\n // if we get a single items instead of a batch\n for (const item of castArray(data)) {\n stream.push(item);\n }\n\n this.ws?.once('message', listener);\n\n await this.#respond(uuid);\n };\n\n this.ws?.once('message', listener);\n\n return stream;\n }\n\n createEntitiesReadStream(): MaybePromise<Readable> {\n return this.#createStageReadStream('entities');\n }\n\n createLinksReadStream(): MaybePromise<Readable> {\n return this.#createStageReadStream('links');\n }\n\n writeAsync = <T>(stream: Writable, data: T) => {\n return new Promise<void>((resolve, reject) => {\n stream.write(data, (error) => {\n if (error) {\n reject(error);\n }\n\n resolve();\n });\n });\n };\n\n async createAssetsReadStream(): Promise<Readable> {\n // Create the streams used to transfer the assets\n const stream = await this.#createStageReadStream('assets');\n const pass = new PassThrough({ objectMode: true });\n\n // Init the asset map\n const assets: {\n // TODO: could we include filename in this for improved logging?\n [assetID: string]: IAsset & {\n stream: PassThrough;\n queue: Array<QueueableAction>;\n status: 'ok' | 'closed' | 'errored';\n timeout?: NodeJS.Timeout;\n };\n } = {};\n\n // Watch for stalled assets; if we don't receive a chunk within timeout, abort transfer\n const resetTimeout = (assetID: string) => {\n if (assets[assetID].timeout) {\n clearTimeout(assets[assetID].timeout);\n }\n assets[assetID].timeout = setTimeout(() => {\n this.#reportInfo(`Asset ${assetID} transfer stalled, aborting.`);\n assets[assetID].status = 'errored';\n assets[assetID].stream.destroy(new Error(`Asset ${assetID} transfer timed out`));\n }, this.options.streamTimeout);\n };\n\n stream\n /**\n * Process a payload of many transfer assets and performs the following tasks:\n * - Start: creates a stream for new assets.\n * - Stream: writes asset chunks to the asset's stream.\n * - End: closes the stream after the asset s transferred and cleanup related resources.\n */\n .on('data', async (payload: Protocol.Client.TransferAssetFlow[]) => {\n for (const item of payload) {\n const { action, assetID } = item;\n\n // Creates the stream to send the incoming asset through\n if (action === 'start') {\n // if a transfer has already been started for the same asset ID, something is wrong\n if (assets[assetID]) {\n throw new Error(`Asset ${assetID} already started`);\n }\n\n this.#reportInfo(`Asset ${assetID} starting`);\n // Register the asset\n assets[assetID] = {\n ...item.data,\n stream: new PassThrough(),\n status: 'ok',\n queue: [],\n };\n\n resetTimeout(assetID);\n\n // Connect the individual asset stream to the main asset stage stream\n // Note: nothing is transferred until data chunks are fed to the asset stream\n await this.writeAsync(pass, assets[assetID]);\n }\n\n // Writes the asset's data chunks to their corresponding stream\n // \"end\" is considered a chunk, but it's not a data chunk, it's a control message\n // That is done so that we don't complicate the already complicated async processing of the queue\n else if (action === 'stream' || action === 'end') {\n // If the asset hasn't been registered, or if it's been closed already, something is wrong\n if (!assets[assetID]) {\n throw new Error(`No id matching ${assetID} for stream action`);\n }\n\n // On every action, reset the timeout timer\n if (action === 'stream') {\n resetTimeout(assetID);\n } else {\n clearTimeout(assets[assetID].timeout);\n }\n\n if (assets[assetID].status === 'closed') {\n throw new Error(`Asset ${assetID} is closed`);\n }\n\n assets[assetID].queue.push(item);\n }\n }\n\n // each new payload will start new processQueue calls, which may cause some extra calls\n // it's essentially saying \"start processing this asset again, I added more data to the queue\"\n for (const assetID in assets) {\n if (Object.prototype.hasOwnProperty.call(assets, assetID)) {\n const asset = assets[assetID];\n if (asset.queue?.length > 0) {\n await processQueue(assetID);\n }\n }\n }\n })\n .on('close', () => {\n pass.end();\n });\n\n /**\n * Start processing the queue for a given assetID\n *\n * Even though this is a loop that attempts to process the entire queue, it is safe to call this more than once\n * for the same asset id because the queue is shared globally, the items are shifted off, and immediately written\n */\n const processQueue = async (id: string) => {\n if (!assets[id]) {\n throw new Error(`Failed to write asset chunk for \"${id}\". Asset not found.`);\n }\n\n const asset = assets[id];\n const { status: currentStatus } = asset;\n\n if (['closed', 'errored'].includes(currentStatus)) {\n throw new Error(\n `Failed to write asset chunk for \"${id}\". The asset is currently \"${currentStatus}\"`\n );\n }\n\n while (asset.queue.length > 0) {\n const data = asset.queue.shift();\n\n if (!data) {\n throw new Error(`Invalid chunk found for ${id}`);\n }\n\n try {\n // if this is an end chunk, close the asset stream\n if (data.action === 'end') {\n this.#reportInfo(`Ending asset stream for ${id}`);\n await closeAssetStream(id);\n break; // Exit the loop after closing the stream\n }\n\n // Save the current chunk\n await writeChunkToStream(id, data);\n } catch {\n if (!assets[id]) {\n throw new Error(`No id matching ${id} for writeAssetChunk`);\n }\n }\n }\n };\n\n /**\n * Writes a chunk of data to the asset's stream.\n *\n * Only check if the targeted asset exists, no other validation is done.\n */\n const writeChunkToStream = async (id: string, data: unknown) => {\n const asset = assets[id];\n\n if (!asset) {\n throw new Error(`Failed to write asset chunk for \"${id}\". Asset not found.`);\n }\n\n const rawBuffer = data as { type: 'Buffer'; data: Uint8Array };\n const chunk = Buffer.from(rawBuffer.data);\n\n await this.writeAsync(asset.stream, chunk);\n };\n\n /**\n * Closes the asset stream associated with the given ID.\n *\n * It deletes the stream for the asset upon successful closure.\n */\n const closeAssetStream = async (id: string) => {\n if (!assets[id]) {\n throw new Error(`Failed to close asset \"${id}\". Asset not found.`);\n }\n\n assets[id].status = 'closed';\n\n await new Promise<void>((resolve, reject) => {\n const { stream } = assets[id];\n\n stream\n .on('close', () => {\n resolve();\n })\n .on('error', (e) => {\n assets[id].status = 'errored';\n reject(new Error(`Failed to close asset \"${id}\". Asset stream error: ${e.toString()}`));\n })\n .end();\n });\n };\n\n return pass;\n }\n\n createConfigurationReadStream(): MaybePromise<Readable> {\n return this.#createStageReadStream('configuration');\n }\n\n async getMetadata(): Promise<IMetadata | null> {\n const metadata = await this.dispatcher?.dispatchTransferAction<IMetadata>('getMetadata');\n\n return metadata ?? null;\n }\n\n assertValidProtocol(url: URL) {\n const validProtocols = ['https:', 'http:'];\n\n if (!validProtocols.includes(url.protocol)) {\n throw new ProviderValidationError(`Invalid protocol \"${url.protocol}\"`, {\n check: 'url',\n details: {\n protocol: url.protocol,\n validProtocols,\n },\n });\n }\n }\n\n async initTransfer(): Promise<string> {\n const query = this.dispatcher?.dispatchCommand({\n command: 'init',\n });\n\n const res = (await query) as Server.Payload<Server.InitMessage>;\n\n if (!res?.transferID) {\n throw new ProviderTransferError('Init failed, invalid response from the server');\n }\n\n return res.transferID;\n }\n\n #reportInfo(message: string) {\n this.#diagnostics?.report({\n details: {\n createdAt: new Date(),\n message,\n origin: 'remote-source-provider',\n },\n kind: 'info',\n });\n }\n\n async bootstrap(diagnostics?: IDiagnosticReporter): Promise<void> {\n this.#diagnostics = diagnostics;\n const { url, auth } = this.options;\n let ws: WebSocket;\n this.assertValidProtocol(url);\n const wsProtocol = url.protocol === 'https:' ? 'wss:' : 'ws:';\n const wsUrl = `${wsProtocol}//${url.host}${trimTrailingSlash(\n url.pathname\n )}${TRANSFER_PATH}/pull`;\n\n this.#reportInfo('establishing websocket connection');\n // No auth defined, trying public access for transfer\n if (!auth) {\n ws = await connectToWebsocket(wsUrl, undefined, this.#diagnostics);\n }\n\n // Common token auth, this should be the main auth method\n else if (auth.type === 'token') {\n const headers = { Authorization: `Bearer ${auth.token}` };\n ws = await connectToWebsocket(wsUrl, { headers }, this.#diagnostics);\n }\n\n // Invalid auth method provided\n else {\n throw new ProviderValidationError('Auth method not available', {\n check: 'auth.type',\n details: {\n auth: auth.type,\n },\n });\n }\n\n this.#reportInfo('established websocket connection');\n this.ws = ws;\n const { retryMessageOptions } = this.options;\n\n this.#reportInfo('creating dispatcher');\n this.dispatcher = createDispatcher(this.ws, retryMessageOptions, (message: string) =>\n this.#reportInfo(message)\n );\n this.#reportInfo('creating dispatcher');\n\n this.#reportInfo('initialize transfer');\n const transferID = await this.initTransfer();\n this.#reportInfo(`initialized transfer ${transferID}`);\n\n this.dispatcher.setTransferProperties({ id: transferID, kind: 'pull' });\n await this.dispatcher.dispatchTransferAction('bootstrap');\n }\n\n async close() {\n await this.dispatcher?.dispatchTransferAction('close');\n\n await new Promise<void>((resolve) => {\n const { ws } = this;\n\n if (!ws || ws.CLOSED) {\n resolve();\n return;\n }\n\n ws.on('close', () => resolve()).close();\n });\n }\n\n async getSchemas() {\n const schemas =\n await this.dispatcher?.dispatchTransferAction<Utils.String.Dict<Struct.Schema>>('getSchemas');\n\n return schemas ?? null;\n }\n\n async #startStep<T extends Client.TransferPullStep>(step: T) {\n try {\n return 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\n async #respond(uuid: string) {\n return new Promise((resolve, reject) => {\n this.ws?.send(JSON.stringify({ uuid }), (e) => {\n if (e) {\n reject(e);\n } else {\n resolve(e);\n }\n });\n });\n }\n\n async #endStep<T extends Client.TransferPullStep>(step: T) {\n try {\n await this.dispatcher?.dispatchTransferStep({ action: 'end', step });\n } catch (e) {\n if (e instanceof Error) {\n return e;\n }\n\n if (typeof e === 'string') {\n return new ProviderTransferError(e);\n }\n\n return new ProviderTransferError('Unexpected error');\n }\n\n return null;\n }\n}\n\nexport const createRemoteStrapiSourceProvider = (options: IRemoteStrapiSourceProviderOptions) => {\n return new RemoteStrapiSourceProvider(options);\n};\n"],"names":["RemoteStrapiSourceProvider","createEntitiesReadStream","createLinksReadStream","createAssetsReadStream","stream","pass","PassThrough","objectMode","assets","resetTimeout","assetID","timeout","clearTimeout","setTimeout","status","destroy","Error","options","streamTimeout","on","payload","item","action","data","queue","writeAsync","push","Object","prototype","hasOwnProperty","call","asset","length","processQueue","end","id","currentStatus","includes","shift","closeAssetStream","writeChunkToStream","rawBuffer","chunk","Buffer","from","Promise","resolve","reject","e","toString","createConfigurationReadStream","getMetadata","metadata","dispatcher","dispatchTransferAction","assertValidProtocol","url","validProtocols","protocol","ProviderValidationError","check","details","initTransfer","query","dispatchCommand","command","res","transferID","ProviderTransferError","bootstrap","diagnostics","auth","ws","wsProtocol","wsUrl","host","trimTrailingSlash","pathname","TRANSFER_PATH","connectToWebsocket","undefined","type","headers","Authorization","token","retryMessageOptions","createDispatcher","message","setTransferProperties","kind","close","CLOSED","getSchemas","schemas","name","defaultOptions","write","error","stage","startResult","processID","listener","raw","parsed","JSON","parse","uuid","once","ended","castArray","report","createdAt","Date","origin","step","dispatchTransferStep","send","stringify","createRemoteStrapiSourceProvider"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../../src/strapi/providers/remote-source/index.ts"],"sourcesContent":["import { createHash, type Hash } from 'crypto';\nimport { PassThrough, Readable, Writable } from 'stream';\nimport type { Struct, Utils } from '@strapi/types';\nimport { WebSocket } from 'ws';\nimport { castArray } from 'lodash/fp';\n\nimport type {\n IAsset,\n IMetadata,\n ISourceProvider,\n ISourceProviderTransferResults,\n MaybePromise,\n Protocol,\n ProviderType,\n StageTotalsEstimate,\n TransferStage,\n} from '../../../../types';\nimport type { IDiagnosticReporter } from '../../../utils/diagnostic';\nimport { Client, Server, Auth } from '../../../../types/remote/protocol';\nimport { ProviderTransferError, ProviderValidationError } from '../../../errors/providers';\nimport { TRANSFER_PATH } from '../../remote/constants';\nimport { decodeTransferAssetStreamItem } from '../../../utils/transfer-asset-chunk';\nimport { write } from '../../../utils/writable-async-write';\nimport { ILocalStrapiSourceProviderOptions } from '../local-source';\nimport {\n createDispatcher,\n connectToWebsocket,\n trimTrailingSlash,\n type RetryMessageOptions,\n} from '../utils';\n\n/**\n * Pull server answers `assets` step `start` only after `estimateAssetTotals` (DB stream; remote sizes from DB when complete, else HTTP like `createAssetsStream`).\n * That can exceed the default dispatcher wait (~30s between resends, a few minutes total). This message\n * uses a longer window so large libraries do not fail with `Request timed out` before totals are returned.\n */\nconst ASSETS_START_RETRY_OVERRIDES: Partial<RetryMessageOptions> = {\n retryMessageTimeout: 120_000,\n retryMessageMaxRetries: 30,\n};\n\nexport interface IRemoteStrapiSourceProviderOptions extends ILocalStrapiSourceProviderOptions {\n url: URL; // the url of the remote Strapi admin\n auth?: Auth.ITransferTokenAuth;\n retryMessageOptions?: {\n retryMessageTimeout: number; // milliseconds to wait for a response from a message\n retryMessageMaxRetries: number; // max number of retries for a message before aborting transfer\n };\n /** Max ms without forward progress on an asset (new remote chunk accepted or chunk fully handed to the asset stream). */\n streamTimeout?: number;\n /** Require per-asset checksum verification for transferred asset bytes. */\n verifyChecksums?: boolean;\n}\n\ntype QueueableAction = Protocol.Client.TransferAssetFlow &\n ({ action: 'stream' } | { action: 'end' });\n\nclass RemoteStrapiSourceProvider implements ISourceProvider {\n name = 'source::remote-strapi';\n\n type: ProviderType = 'source';\n\n options: IRemoteStrapiSourceProviderOptions;\n\n ws: WebSocket | null;\n\n dispatcher: ReturnType<typeof createDispatcher> | null;\n\n defaultOptions: Partial<IRemoteStrapiSourceProviderOptions> = {\n // Large files + JSON/WS backpressure can go minutes between *messages* while bytes still drain locally\n streamTimeout: 300_000,\n };\n\n constructor(options: IRemoteStrapiSourceProviderOptions) {\n this.options = {\n ...this.defaultOptions,\n ...options,\n };\n this.#checksumsEnabled = this.options.verifyChecksums === true;\n\n this.ws = null;\n this.dispatcher = null;\n }\n\n results?: ISourceProviderTransferResults | undefined;\n\n #diagnostics?: IDiagnosticReporter;\n\n #pullAssetStreamWireSampleLogged = false;\n\n #checksumsEnabled = false;\n\n /** Set from pull server `start` response for `assets` when present (for engine `getStageTotals`). */\n #cachedAssetsTotals?: StageTotalsEstimate;\n\n async #createStageReadStream(stage: Exclude<TransferStage, 'schemas'>) {\n if (stage === 'assets') {\n this.#cachedAssetsTotals = undefined;\n }\n\n const startResult = await this.#startStep(stage);\n\n if (startResult instanceof Error) {\n throw startResult;\n }\n\n const { id: processID, totals } = startResult as {\n id: string;\n totals?: StageTotalsEstimate;\n };\n\n if (stage === 'assets' && totals && (totals.totalBytes != null || totals.totalCount != null)) {\n this.#cachedAssetsTotals = totals;\n }\n\n // Default object-mode HWM (~16 chunks). Do not await `drain` on manual `push` while `pipe()`\n // is attached — drain/`readableLength` races reliably deadlock after a few 1MiB asset frames.\n // Backpressure for pull assets is enforced by the Writable below (`highWaterMark: 1`).\n const stream = new PassThrough({ objectMode: true });\n\n const listener = async (raw: Buffer) => {\n const parsed = JSON.parse(raw.toString());\n // If not a message related to our transfer process, ignore it\n if (!parsed.uuid || parsed?.data?.type !== 'transfer' || parsed?.data?.id !== processID) {\n this.ws?.once('message', listener);\n return;\n }\n\n const { uuid, data: message } = parsed;\n const { ended, error, data } = message;\n\n if (error) {\n await this.#respond(uuid);\n stream.destroy(error);\n return;\n }\n\n if (ended) {\n await this.#respond(uuid);\n await this.#endStep(stage);\n\n stream.end();\n return;\n }\n\n for (const item of castArray(data)) {\n stream.push(item as Parameters<PassThrough['push']>[0]);\n }\n\n this.ws?.once('message', listener);\n\n await this.#respond(uuid);\n };\n\n this.ws?.once('message', listener);\n\n return stream;\n }\n\n createEntitiesReadStream(): MaybePromise<Readable> {\n return this.#createStageReadStream('entities');\n }\n\n createLinksReadStream(): MaybePromise<Readable> {\n return this.#createStageReadStream('links');\n }\n\n async createAssetsReadStream(): Promise<Readable> {\n // Create the streams used to transfer the assets\n const stream = await this.#createStageReadStream('assets');\n const pass = new PassThrough({ objectMode: true });\n\n // Init the asset map\n const assets: {\n // TODO: could we include filename in this for improved logging?\n [assetID: string]: IAsset & {\n stream: PassThrough;\n queue: Array<QueueableAction>;\n status: 'ok' | 'closed' | 'errored';\n timeout?: NodeJS.Timeout;\n checksumHash?: Hash;\n };\n } = {};\n\n // Watch for stalled assets: no remote chunks and no completed writes to the asset stream for streamTimeout ms\n const resetTimeout = (assetID: string) => {\n if (!assets[assetID]) {\n return;\n }\n if (assets[assetID].timeout) {\n clearTimeout(assets[assetID].timeout);\n }\n assets[assetID].timeout = setTimeout(() => {\n if (!assets[assetID]) {\n return;\n }\n this.#reportInfo(`Asset ${assetID} transfer stalled, aborting.`);\n assets[assetID].status = 'errored';\n assets[assetID].stream.destroy(new Error(`Asset ${assetID} transfer timed out`));\n }, this.options.streamTimeout);\n };\n\n const clearStallTimeoutForAsset = (assetID: string) => {\n const entry = assets[assetID];\n if (entry?.timeout) {\n clearTimeout(entry.timeout);\n entry.timeout = undefined;\n }\n };\n\n const clearAllStallTimeouts = () => {\n for (const id of Object.keys(assets)) {\n clearStallTimeoutForAsset(id);\n }\n };\n\n /**\n * Serialize asset batch handling: `Readable.on('data', async …)` does not apply backpressure,\n * so we pipe through a Writable with highWaterMark 1 so only one batch is in flight.\n */\n const processAssetPayload = async (payload: Protocol.Client.TransferAssetFlow[]) => {\n for (const item of payload) {\n const { action, assetID } = item;\n\n if (action === 'start') {\n if (assets[assetID]) {\n throw new Error(`Asset ${assetID} already started`);\n }\n\n this.#reportInfo(`Asset ${assetID} starting`);\n assets[assetID] = {\n ...item.data,\n stream: new PassThrough(),\n status: 'ok',\n queue: [],\n ...(this.#checksumsEnabled ? { checksumHash: createHash('sha256') } : {}),\n };\n\n resetTimeout(assetID);\n\n await write(pass, assets[assetID]);\n } else if (action === 'stream' || action === 'end') {\n if (!assets[assetID]) {\n throw new Error(`No id matching ${assetID} for stream action`);\n }\n\n if (action === 'stream') {\n if (!this.#pullAssetStreamWireSampleLogged) {\n this.#pullAssetStreamWireSampleLogged = true;\n const { data } = item;\n // Same legacy shape `decodeTransferAssetStreamData` accepts after JSON.parse (proof, not frame-size guess).\n const legacyBufferJson =\n data &&\n typeof data === 'object' &&\n !Buffer.isBuffer(data) &&\n (data as { type?: string }).type === 'Buffer' &&\n (Array.isArray((data as { data?: unknown }).data) ||\n ArrayBuffer.isView((data as { data?: unknown }).data));\n if (legacyBufferJson) {\n this.#reportWarning(\n '[Data transfer][pull] Remote is using legacy Buffer JSON for asset chunks (each byte as a JSON number). That uses much more memory during JSON.parse than base64. Upgrade the remote Strapi to a version that sends base64 asset chunks, or out-of-memory errors may still happen on large files.'\n );\n }\n }\n resetTimeout(assetID);\n } else {\n clearTimeout(assets[assetID].timeout);\n }\n\n if (assets[assetID].status === 'closed') {\n throw new Error(`Asset ${assetID} is closed`);\n }\n\n assets[assetID].queue.push(item);\n }\n }\n\n for (const assetID in assets) {\n if (Object.prototype.hasOwnProperty.call(assets, assetID)) {\n const asset = assets[assetID];\n if (asset.queue?.length > 0) {\n await processQueue(assetID);\n }\n }\n }\n };\n\n const processor = new Writable({\n objectMode: true,\n highWaterMark: 1,\n write(payload: Protocol.Client.TransferAssetFlow[], _encoding, callback) {\n processAssetPayload(payload).then(\n () => {\n callback();\n },\n (err: Error) => {\n clearAllStallTimeouts();\n stream.destroy(err);\n callback(err);\n }\n );\n },\n final(callback) {\n pass.end();\n callback();\n },\n });\n\n processor.on('error', (err) => {\n clearAllStallTimeouts();\n pass.destroy(err);\n });\n\n stream.on('error', (err) => {\n clearAllStallTimeouts();\n processor.destroy(err);\n pass.destroy(err);\n });\n\n stream.once('end', () => {\n clearAllStallTimeouts();\n });\n\n stream.pipe(processor);\n\n /**\n * Start processing the queue for a given assetID\n *\n * Even though this is a loop that attempts to process the entire queue, it is safe to call this more than once\n * for the same asset id because the queue is shared globally, the items are shifted off, and immediately written\n */\n const processQueue = async (id: string) => {\n if (!assets[id]) {\n throw new Error(`Failed to write asset chunk for \"${id}\". Asset not found.`);\n }\n\n const asset = assets[id];\n const { status: currentStatus } = asset;\n\n if (['closed', 'errored'].includes(currentStatus)) {\n throw new Error(\n `Failed to write asset chunk for \"${id}\". The asset is currently \"${currentStatus}\"`\n );\n }\n\n while (asset.queue.length > 0) {\n const data = asset.queue.shift();\n\n if (!data) {\n throw new Error(`Invalid chunk found for ${id}`);\n }\n\n try {\n // if this is an end chunk, close the asset stream\n if (data.action === 'end') {\n this.#reportInfo(`Ending asset stream for ${id}`);\n await closeAssetStream(id, data.checksum);\n break; // Exit the loop after closing the stream\n }\n\n // Save the current chunk\n await writeChunkToStream(id, data);\n } catch (error) {\n if (!assets[id]) {\n throw new Error(`No id matching ${id} for writeAssetChunk`);\n }\n clearStallTimeoutForAsset(id);\n if (error instanceof Error) {\n throw error;\n }\n throw new Error(`Unexpected error while processing asset chunk for \"${id}\"`);\n }\n }\n };\n\n /**\n * Writes a chunk of data to the asset's stream.\n *\n * Only check if the targeted asset exists, no other validation is done.\n */\n const writeChunkToStream = async (id: string, item: QueueableAction) => {\n const asset = assets[id];\n\n if (!asset) {\n throw new Error(`Failed to write asset chunk for \"${id}\". Asset not found.`);\n }\n\n if (item.action !== 'stream') {\n throw new Error(`Expected stream queue item for \"${id}\"`);\n }\n const chunk = decodeTransferAssetStreamItem(item);\n asset.checksumHash?.update(chunk);\n\n await write(asset.stream, chunk);\n // Count slow draining as progress so backpressure on large chunks does not trip the stall timer\n resetTimeout(id);\n };\n\n /**\n * Closes the asset stream associated with the given ID.\n *\n * It deletes the stream for the asset upon successful closure.\n */\n const closeAssetStream = async (\n id: string,\n checksum?: { algorithm: 'sha256'; value: string }\n ) => {\n if (!assets[id]) {\n throw new Error(`Failed to close asset \"${id}\". Asset not found.`);\n }\n\n const asset = assets[id];\n // The queue processes stream chunks before `end`; the last `writeChunkToStream` calls\n // `resetTimeout` after the `end` chunk already cleared the timer — clear again before closing.\n clearStallTimeoutForAsset(id);\n\n if (this.#checksumsEnabled) {\n if (!checksum) {\n throw new ProviderTransferError(\n `Asset ${id} is missing checksum in transfer end payload`\n );\n }\n if (checksum.algorithm !== 'sha256') {\n throw new ProviderTransferError(\n `Asset ${id} checksum algorithm \"${checksum.algorithm}\" is not supported`\n );\n }\n const actual = asset.checksumHash?.digest('hex');\n if (!actual || actual !== checksum.value) {\n throw new ProviderTransferError(\n `Checksum mismatch for asset \"${id}\" (expected ${checksum.value}, got ${actual ?? 'none'})`\n );\n }\n }\n asset.status = 'closed';\n\n await new Promise<void>((resolve, reject) => {\n const { stream } = asset;\n\n stream\n .on('close', () => {\n delete assets[id];\n resolve();\n })\n .on('error', (e) => {\n delete assets[id];\n reject(new Error(`Failed to close asset \"${id}\". Asset stream error: ${e.toString()}`));\n })\n .end();\n });\n };\n\n return pass;\n }\n\n createConfigurationReadStream(): MaybePromise<Readable> {\n return this.#createStageReadStream('configuration');\n }\n\n async getMetadata(): Promise<IMetadata | null> {\n const metadata = await this.dispatcher?.dispatchTransferAction<IMetadata>('getMetadata');\n\n return metadata ?? null;\n }\n\n assertValidProtocol(url: URL) {\n const validProtocols = ['https:', 'http:'];\n\n if (!validProtocols.includes(url.protocol)) {\n throw new ProviderValidationError(`Invalid protocol \"${url.protocol}\"`, {\n check: 'url',\n details: {\n protocol: url.protocol,\n validProtocols,\n },\n });\n }\n }\n\n async initTransfer(): Promise<string> {\n const wantsChecksums = this.options.verifyChecksums === true;\n const query = this.dispatcher?.dispatchCommand({\n command: 'init',\n ...(wantsChecksums ? { params: { transfer: 'pull', checksums: true } } : {}),\n });\n\n const res = (await query) as\n | (Server.Payload<Server.InitMessage> & { checksums?: boolean })\n | null;\n\n if (!res?.transferID) {\n throw new ProviderTransferError('Init failed, invalid response from the server');\n }\n this.#checksumsEnabled = wantsChecksums && res.checksums === true;\n if (wantsChecksums && res.checksums !== true) {\n this.#reportWarning(\n '[Data transfer][pull] Checksums were requested but the remote does not support checksum negotiation; continuing without checksum validation.'\n );\n }\n\n return res.transferID;\n }\n\n #reportInfo(message: string) {\n this.#diagnostics?.report({\n details: {\n createdAt: new Date(),\n message,\n origin: 'remote-source-provider',\n },\n kind: 'info',\n });\n }\n\n /** Reports a warning diagnostic (`kind: 'warning'`). Consumers (e.g. CLI) choose log levels and routing. */\n #reportWarning(message: string) {\n this.#diagnostics?.report({\n details: {\n createdAt: new Date(),\n message,\n origin: 'remote-source-provider',\n },\n kind: 'warning',\n });\n }\n\n async bootstrap(diagnostics?: IDiagnosticReporter): Promise<void> {\n this.#diagnostics = diagnostics;\n const { url, auth } = this.options;\n let ws: WebSocket;\n this.assertValidProtocol(url);\n const wsProtocol = url.protocol === 'https:' ? 'wss:' : 'ws:';\n const wsUrl = `${wsProtocol}//${url.host}${trimTrailingSlash(\n url.pathname\n )}${TRANSFER_PATH}/pull`;\n\n this.#pullAssetStreamWireSampleLogged = false;\n\n this.#reportInfo('establishing websocket connection');\n // No auth defined, trying public access for transfer\n if (!auth) {\n ws = await connectToWebsocket(wsUrl, undefined, this.#diagnostics);\n }\n\n // Common token auth, this should be the main auth method\n else if (auth.type === 'token') {\n const headers = { Authorization: `Bearer ${auth.token}` };\n ws = await connectToWebsocket(wsUrl, { headers }, this.#diagnostics);\n }\n\n // Invalid auth method provided\n else {\n throw new ProviderValidationError('Auth method not available', {\n check: 'auth.type',\n details: {\n auth: auth.type,\n },\n });\n }\n\n this.#reportInfo('established websocket connection');\n this.ws = ws;\n const { retryMessageOptions } = this.options;\n\n this.#reportInfo('creating dispatcher');\n this.dispatcher = createDispatcher(this.ws, retryMessageOptions, (message: string) =>\n this.#reportInfo(message)\n );\n this.#reportInfo('created dispatcher');\n\n this.#reportInfo('initialize transfer');\n const transferID = await this.initTransfer();\n this.#reportInfo(`initialized transfer ${transferID}`);\n\n this.dispatcher.setTransferProperties({ id: transferID, kind: 'pull' });\n await this.dispatcher.dispatchTransferAction('bootstrap');\n }\n\n async close() {\n await this.dispatcher?.dispatchTransferAction('close');\n\n await new Promise<void>((resolve) => {\n const { ws } = this;\n\n if (!ws || ws.CLOSED) {\n resolve();\n return;\n }\n\n ws.on('close', () => resolve()).close();\n });\n }\n\n async getSchemas() {\n const schemas =\n await this.dispatcher?.dispatchTransferAction<Utils.String.Dict<Struct.Schema>>('getSchemas');\n\n return schemas ?? null;\n }\n\n async getStageTotals(stage: TransferStage): Promise<StageTotalsEstimate | null> {\n if (stage !== 'assets') {\n return null;\n }\n const cached = this.#cachedAssetsTotals;\n return cached ?? null;\n }\n\n async #startStep<T extends Client.TransferPullStep>(step: T) {\n try {\n return await this.dispatcher?.dispatchTransferStep(\n { action: 'start', step },\n step === 'assets' ? { retryOverrides: ASSETS_START_RETRY_OVERRIDES } : undefined\n );\n } catch (e) {\n if (e instanceof Error) {\n return e;\n }\n\n if (typeof e === 'string') {\n return new ProviderTransferError(e);\n }\n\n return new ProviderTransferError('Unexpected error');\n }\n }\n\n async #respond(uuid: string) {\n return new Promise((resolve, reject) => {\n this.ws?.send(JSON.stringify({ uuid }), (e) => {\n if (e) {\n reject(e);\n } else {\n resolve(e);\n }\n });\n });\n }\n\n async #endStep<T extends Client.TransferPullStep>(step: T) {\n try {\n await this.dispatcher?.dispatchTransferStep({ action: 'end', step });\n } catch (e) {\n if (e instanceof Error) {\n return e;\n }\n\n if (typeof e === 'string') {\n return new ProviderTransferError(e);\n }\n\n return new ProviderTransferError('Unexpected error');\n }\n\n return null;\n }\n}\n\nexport const createRemoteStrapiSourceProvider = (options: IRemoteStrapiSourceProviderOptions) => {\n return new RemoteStrapiSourceProvider(options);\n};\n"],"names":["ASSETS_START_RETRY_OVERRIDES","retryMessageTimeout","retryMessageMaxRetries","RemoteStrapiSourceProvider","createEntitiesReadStream","createLinksReadStream","createAssetsReadStream","stream","pass","PassThrough","objectMode","assets","resetTimeout","assetID","timeout","clearTimeout","setTimeout","status","destroy","Error","options","streamTimeout","clearStallTimeoutForAsset","entry","undefined","clearAllStallTimeouts","id","Object","keys","processAssetPayload","payload","item","action","data","queue","checksumHash","createHash","write","legacyBufferJson","Buffer","isBuffer","type","Array","isArray","ArrayBuffer","isView","push","prototype","hasOwnProperty","call","asset","length","processQueue","processor","Writable","highWaterMark","_encoding","callback","then","err","final","end","on","once","pipe","currentStatus","includes","shift","closeAssetStream","checksum","writeChunkToStream","error","chunk","decodeTransferAssetStreamItem","update","ProviderTransferError","algorithm","actual","digest","value","Promise","resolve","reject","e","toString","createConfigurationReadStream","getMetadata","metadata","dispatcher","dispatchTransferAction","assertValidProtocol","url","validProtocols","protocol","ProviderValidationError","check","details","initTransfer","wantsChecksums","verifyChecksums","query","dispatchCommand","command","params","transfer","checksums","res","transferID","bootstrap","diagnostics","auth","ws","wsProtocol","wsUrl","host","trimTrailingSlash","pathname","TRANSFER_PATH","connectToWebsocket","headers","Authorization","token","retryMessageOptions","createDispatcher","message","setTransferProperties","kind","close","CLOSED","getSchemas","schemas","getStageTotals","stage","cached","name","defaultOptions","startResult","processID","totals","totalBytes","totalCount","listener","raw","parsed","JSON","parse","uuid","ended","castArray","report","createdAt","Date","origin","step","dispatchTransferStep","retryOverrides","send","stringify","createRemoteStrapiSourceProvider"],"mappings":"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"}
@@ -7,14 +7,17 @@ interface IDispatcherState {
7
7
  id: string;
8
8
  };
9
9
  }
10
+ export interface RetryMessageOptions {
11
+ retryMessageMaxRetries: number;
12
+ retryMessageTimeout: number;
13
+ }
10
14
  interface IDispatchOptions {
11
15
  attachTransfer?: boolean;
16
+ /** Merged onto the dispatcher's default `retryMessageOptions` for this message only. */
17
+ retryOverrides?: Partial<RetryMessageOptions>;
12
18
  }
13
19
  type Dispatch<T> = Omit<T, 'transferID' | 'uuid'>;
14
- export declare const createDispatcher: (ws: WebSocket, retryMessageOptions?: {
15
- retryMessageMaxRetries: number;
16
- retryMessageTimeout: number;
17
- }, reportInfo?: (message: string) => void) => {
20
+ export declare const createDispatcher: (ws: WebSocket, retryMessageOptions?: RetryMessageOptions, reportInfo?: (message: string) => void) => {
18
21
  readonly transferID: string | undefined;
19
22
  readonly transferKind: any;
20
23
  setTransferProperties: (properties: Exclude<IDispatcherState['transfer'], undefined>) => void;
@@ -25,12 +28,12 @@ export declare const createDispatcher: (ws: WebSocket, retryMessageOptions?: {
25
28
  params?: Client.GetCommandParams<U_1> | undefined;
26
29
  })) => Promise<null>;
27
30
  dispatchTransferAction: <T>(action: Client.Action['action']) => Promise<T | null>;
28
- dispatchTransferStep: <T_1, A extends "end" | "start" | "stream" = "end" | "start" | "stream", S extends "entities" | "links" | "assets" | "configuration" = "entities" | "links" | "assets" | "configuration">(payload: {
31
+ dispatchTransferStep: <T_1, A extends "end" | "stream" | "start" = "end" | "stream" | "start", S extends "entities" | "links" | "assets" | "configuration" = "entities" | "links" | "assets" | "configuration">(payload: {
29
32
  step: S;
30
33
  action: A;
31
34
  } & (A extends 'stream' ? {
32
35
  data: Client.GetTransferPushStreamData<S>;
33
- } : unknown)) => Promise<T_1 | null>;
36
+ } : unknown), dispatchOptions?: Omit<IDispatchOptions, 'attachTransfer'>) => Promise<T_1 | null>;
34
37
  };
35
38
  type WebsocketParams = ConstructorParameters<typeof WebSocket>;
36
39
  type Address = WebsocketParams[0];
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/strapi/providers/utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAW,SAAS,EAAE,MAAM,IAAI,CAAC;AAExC,OAAO,KAAK,EAAE,MAAM,EAAU,MAAM,gCAAgC,CAAC;AASrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAE7D,UAAU,gBAAgB;IACxB,QAAQ,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC,YAAY,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;CACtD;AAED,UAAU,gBAAgB;IACxB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,KAAK,QAAQ,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,YAAY,GAAG,MAAM,CAAC,CAAC;AAElD,eAAO,MAAM,gBAAgB,OACvB,SAAS;;;gBAKA,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI;;;wCAgIxB,QAAQ,gBAAgB,CAAC,UAAU,CAAC,EAAE,SAAS,CAAC,KAC3D,IAAI;sEAzHI,gBAAgB,KACxB,QAAQ,CAAC,GAAG,IAAI,CAAC;;;;;;wCA6F6B,OAAO,MAAM,CAAC,QAAQ,CAAC;6NAW7D;QACP,IAAI,EAAE,CAAC,CAAC;QACR,MAAM,EAAE,CAAC,CAAC;KACX,GAAG,CAAC,CAAC,SAAS,QAAQ,GAAG;QAAE,IAAI,EAAE,OAAO,yBAAyB,CAAC,CAAC,CAAC,CAAA;KAAE,GAAG,OAAO,CAAC;CAiCrF,CAAC;AAEF,KAAK,eAAe,GAAG,qBAAqB,CAAC,OAAO,SAAS,CAAC,CAAC;AAC/D,KAAK,OAAO,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;AAClC,KAAK,OAAO,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;AAElC,eAAO,MAAM,kBAAkB,YACpB,OAAO,YACN,OAAO,gBACH,mBAAmB,KAChC,QAAQ,SAAS,CA0DnB,CAAC;AAEF,eAAO,MAAM,iBAAiB,UAAW,MAAM,KAAG,MAEjD,CAAC;AAEF,eAAO,MAAM,IAAI,OAAQ,MAAM,kBAI9B,CAAC;AAEF,eAAO,MAAM,SAAS,SAAgB,MAAM,OAAO,YAAY,MAAM,KAAG,QAAQ,IAAI,CAMnF,CAAC"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/strapi/providers/utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAW,SAAS,EAAE,MAAM,IAAI,CAAC;AAExC,OAAO,KAAK,EAAE,MAAM,EAAU,MAAM,gCAAgC,CAAC;AASrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAG7D,UAAU,gBAAgB;IACxB,QAAQ,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC,YAAY,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;CACtD;AAED,MAAM,WAAW,mBAAmB;IAClC,sBAAsB,EAAE,MAAM,CAAC;IAC/B,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED,UAAU,gBAAgB;IACxB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,wFAAwF;IACxF,cAAc,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAC;CAC/C;AAED,KAAK,QAAQ,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,YAAY,GAAG,MAAM,CAAC,CAAC;AAElD,eAAO,MAAM,gBAAgB,OACvB,SAAS,wBACQ,mBAAmB,eAI3B,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI;;;wCAwIxB,QAAQ,gBAAgB,CAAC,UAAU,CAAC,EAAE,SAAS,CAAC,KAC3D,IAAI;sEAjII,gBAAgB,KACxB,QAAQ,CAAC,GAAG,IAAI,CAAC;;;;;;wCAkG6B,OAAO,MAAM,CAAC,QAAQ,CAAC;6NAW7D;QACP,IAAI,EAAE,CAAC,CAAC;QACR,MAAM,EAAE,CAAC,CAAC;KACX,GAAG,CAAC,CAAC,SAAS,QAAQ,GAAG;QAAE,IAAI,EAAE,OAAO,yBAAyB,CAAC,CAAC,CAAC,CAAA;KAAE,GAAG,OAAO,CAAC,oBAChE,KAAK,gBAAgB,EAAE,gBAAgB,CAAC;CAmC7D,CAAC;AAEF,KAAK,eAAe,GAAG,qBAAqB,CAAC,OAAO,SAAS,CAAC,CAAC;AAC/D,KAAK,OAAO,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;AAClC,KAAK,OAAO,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;AAElC,eAAO,MAAM,kBAAkB,YACpB,OAAO,YACN,OAAO,gBACH,mBAAmB,KAChC,QAAQ,SAAS,CA0DnB,CAAC;AAEF,eAAO,MAAM,iBAAiB,UAAW,MAAM,KAAG,MAEjD,CAAC;AAEF,eAAO,MAAM,IAAI,OAAQ,MAAM,kBAI9B,CAAC;AAEF,eAAO,MAAM,SAAS,SAAgB,MAAM,OAAO,YAAY,MAAM,KAAG,QAAQ,IAAI,CAMnF,CAAC"}