@strapi/data-transfer 5.12.0 → 5.12.2

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 (213) hide show
  1. package/dist/engine/errors.js +39 -0
  2. package/dist/engine/errors.js.map +1 -0
  3. package/dist/engine/errors.mjs +34 -0
  4. package/dist/engine/errors.mjs.map +1 -0
  5. package/dist/engine/index.js +797 -0
  6. package/dist/engine/index.js.map +1 -0
  7. package/dist/engine/index.mjs +792 -0
  8. package/dist/engine/index.mjs.map +1 -0
  9. package/dist/engine/validation/provider.js +19 -0
  10. package/dist/engine/validation/provider.js.map +1 -0
  11. package/dist/engine/validation/provider.mjs +17 -0
  12. package/dist/engine/validation/provider.mjs.map +1 -0
  13. package/dist/engine/validation/schemas/index.js +57 -0
  14. package/dist/engine/validation/schemas/index.js.map +1 -0
  15. package/dist/engine/validation/schemas/index.mjs +55 -0
  16. package/dist/engine/validation/schemas/index.mjs.map +1 -0
  17. package/dist/errors/base.js +13 -0
  18. package/dist/errors/base.js.map +1 -0
  19. package/dist/errors/base.mjs +11 -0
  20. package/dist/errors/base.mjs.map +1 -0
  21. package/dist/errors/constants.js +10 -0
  22. package/dist/errors/constants.js.map +1 -0
  23. package/dist/errors/constants.mjs +8 -0
  24. package/dist/errors/constants.mjs.map +1 -0
  25. package/dist/errors/providers.js +41 -0
  26. package/dist/errors/providers.js.map +1 -0
  27. package/dist/errors/providers.mjs +36 -0
  28. package/dist/errors/providers.mjs.map +1 -0
  29. package/dist/file/index.js +8 -0
  30. package/dist/file/index.js.map +1 -0
  31. package/dist/file/index.mjs +3 -0
  32. package/dist/file/index.mjs.map +1 -0
  33. package/dist/file/providers/destination/index.js +248 -0
  34. package/dist/file/providers/destination/index.js.map +1 -0
  35. package/dist/file/providers/destination/index.mjs +246 -0
  36. package/dist/file/providers/destination/index.mjs.map +1 -0
  37. package/dist/file/providers/destination/utils.js +63 -0
  38. package/dist/file/providers/destination/utils.js.map +1 -0
  39. package/dist/file/providers/destination/utils.mjs +60 -0
  40. package/dist/file/providers/destination/utils.mjs.map +1 -0
  41. package/dist/file/providers/index.js +10 -0
  42. package/dist/file/providers/index.js.map +1 -0
  43. package/dist/file/providers/index.mjs +3 -0
  44. package/dist/file/providers/index.mjs.map +1 -0
  45. package/dist/file/providers/source/index.js +288 -0
  46. package/dist/file/providers/source/index.js.map +1 -0
  47. package/dist/file/providers/source/index.mjs +286 -0
  48. package/dist/file/providers/source/index.mjs.map +1 -0
  49. package/dist/file/providers/source/utils.js +56 -0
  50. package/dist/file/providers/source/utils.js.map +1 -0
  51. package/dist/file/providers/source/utils.mjs +52 -0
  52. package/dist/file/providers/source/utils.mjs.map +1 -0
  53. package/dist/index.js +8 -5692
  54. package/dist/index.js.map +1 -1
  55. package/dist/index.mjs +8 -5674
  56. package/dist/index.mjs.map +1 -1
  57. package/dist/strapi/index.js +12 -0
  58. package/dist/strapi/index.js.map +1 -0
  59. package/dist/strapi/index.mjs +7 -0
  60. package/dist/strapi/index.mjs.map +1 -0
  61. package/dist/strapi/providers/index.js +16 -0
  62. package/dist/strapi/providers/index.js.map +1 -0
  63. package/dist/strapi/providers/index.mjs +7 -0
  64. package/dist/strapi/providers/index.mjs.map +1 -0
  65. package/dist/strapi/providers/local-destination/index.js +419 -0
  66. package/dist/strapi/providers/local-destination/index.js.map +1 -0
  67. package/dist/strapi/providers/local-destination/index.mjs +396 -0
  68. package/dist/strapi/providers/local-destination/index.mjs.map +1 -0
  69. package/dist/strapi/providers/local-destination/strategies/restore/configuration.js +52 -0
  70. package/dist/strapi/providers/local-destination/strategies/restore/configuration.js.map +1 -0
  71. package/dist/strapi/providers/local-destination/strategies/restore/configuration.mjs +49 -0
  72. package/dist/strapi/providers/local-destination/strategies/restore/configuration.mjs.map +1 -0
  73. package/dist/strapi/providers/local-destination/strategies/restore/entities.js +64 -0
  74. package/dist/strapi/providers/local-destination/strategies/restore/entities.js.map +1 -0
  75. package/dist/strapi/providers/local-destination/strategies/restore/entities.mjs +62 -0
  76. package/dist/strapi/providers/local-destination/strategies/restore/entities.mjs.map +1 -0
  77. package/dist/strapi/providers/local-destination/strategies/restore/index.js +126 -0
  78. package/dist/strapi/providers/local-destination/strategies/restore/index.js.map +1 -0
  79. package/dist/strapi/providers/local-destination/strategies/restore/index.mjs +122 -0
  80. package/dist/strapi/providers/local-destination/strategies/restore/index.mjs.map +1 -0
  81. package/dist/strapi/providers/local-destination/strategies/restore/links.js +60 -0
  82. package/dist/strapi/providers/local-destination/strategies/restore/links.js.map +1 -0
  83. package/dist/strapi/providers/local-destination/strategies/restore/links.mjs +58 -0
  84. package/dist/strapi/providers/local-destination/strategies/restore/links.mjs.map +1 -0
  85. package/dist/strapi/providers/local-source/assets.js +123 -0
  86. package/dist/strapi/providers/local-source/assets.js.map +1 -0
  87. package/dist/strapi/providers/local-source/assets.mjs +121 -0
  88. package/dist/strapi/providers/local-source/assets.mjs.map +1 -0
  89. package/dist/strapi/providers/local-source/configuration.js +39 -0
  90. package/dist/strapi/providers/local-source/configuration.js.map +1 -0
  91. package/dist/strapi/providers/local-source/configuration.mjs +37 -0
  92. package/dist/strapi/providers/local-source/configuration.mjs.map +1 -0
  93. package/dist/strapi/providers/local-source/entities.js +62 -0
  94. package/dist/strapi/providers/local-source/entities.js.map +1 -0
  95. package/dist/strapi/providers/local-source/entities.mjs +59 -0
  96. package/dist/strapi/providers/local-source/entities.mjs.map +1 -0
  97. package/dist/strapi/providers/local-source/index.js +154 -0
  98. package/dist/strapi/providers/local-source/index.js.map +1 -0
  99. package/dist/strapi/providers/local-source/index.mjs +152 -0
  100. package/dist/strapi/providers/local-source/index.mjs.map +1 -0
  101. package/dist/strapi/providers/local-source/links.js +26 -0
  102. package/dist/strapi/providers/local-source/links.js.map +1 -0
  103. package/dist/strapi/providers/local-source/links.mjs +24 -0
  104. package/dist/strapi/providers/local-source/links.mjs.map +1 -0
  105. package/dist/strapi/providers/remote-destination/index.js +392 -0
  106. package/dist/strapi/providers/remote-destination/index.js.map +1 -0
  107. package/dist/strapi/providers/remote-destination/index.mjs +390 -0
  108. package/dist/strapi/providers/remote-destination/index.mjs.map +1 -0
  109. package/dist/strapi/providers/remote-source/index.js +405 -0
  110. package/dist/strapi/providers/remote-source/index.js.map +1 -0
  111. package/dist/strapi/providers/remote-source/index.mjs +403 -0
  112. package/dist/strapi/providers/remote-source/index.mjs.map +1 -0
  113. package/dist/strapi/providers/utils.js +173 -0
  114. package/dist/strapi/providers/utils.js.map +1 -0
  115. package/dist/strapi/providers/utils.mjs +169 -0
  116. package/dist/strapi/providers/utils.mjs.map +1 -0
  117. package/dist/strapi/queries/entity.js +125 -0
  118. package/dist/strapi/queries/entity.js.map +1 -0
  119. package/dist/strapi/queries/entity.mjs +123 -0
  120. package/dist/strapi/queries/entity.mjs.map +1 -0
  121. package/dist/strapi/queries/index.js +10 -0
  122. package/dist/strapi/queries/index.js.map +1 -0
  123. package/dist/strapi/queries/index.mjs +5 -0
  124. package/dist/strapi/queries/index.mjs.map +1 -0
  125. package/dist/strapi/queries/link.js +298 -0
  126. package/dist/strapi/queries/link.js.map +1 -0
  127. package/dist/strapi/queries/link.mjs +295 -0
  128. package/dist/strapi/queries/link.mjs.map +1 -0
  129. package/dist/strapi/remote/constants.js +11 -0
  130. package/dist/strapi/remote/constants.js.map +1 -0
  131. package/dist/strapi/remote/constants.mjs +8 -0
  132. package/dist/strapi/remote/constants.mjs.map +1 -0
  133. package/dist/strapi/remote/flows/default.js +43 -0
  134. package/dist/strapi/remote/flows/default.js.map +1 -0
  135. package/dist/strapi/remote/flows/default.mjs +41 -0
  136. package/dist/strapi/remote/flows/default.mjs.map +1 -0
  137. package/dist/strapi/remote/flows/index.js +54 -0
  138. package/dist/strapi/remote/flows/index.js.map +1 -0
  139. package/dist/strapi/remote/flows/index.mjs +52 -0
  140. package/dist/strapi/remote/flows/index.mjs.map +1 -0
  141. package/dist/strapi/remote/handlers/constants.js +10 -0
  142. package/dist/strapi/remote/handlers/constants.js.map +1 -0
  143. package/dist/strapi/remote/handlers/constants.mjs +8 -0
  144. package/dist/strapi/remote/handlers/constants.mjs.map +1 -0
  145. package/dist/strapi/remote/handlers/index.js +12 -0
  146. package/dist/strapi/remote/handlers/index.js.map +1 -0
  147. package/dist/strapi/remote/handlers/index.mjs +4 -0
  148. package/dist/strapi/remote/handlers/index.mjs.map +1 -0
  149. package/dist/strapi/remote/handlers/pull.js +348 -0
  150. package/dist/strapi/remote/handlers/pull.js.map +1 -0
  151. package/dist/strapi/remote/handlers/pull.mjs +346 -0
  152. package/dist/strapi/remote/handlers/pull.mjs.map +1 -0
  153. package/dist/strapi/remote/handlers/push.js +400 -0
  154. package/dist/strapi/remote/handlers/push.js.map +1 -0
  155. package/dist/strapi/remote/handlers/push.mjs +398 -0
  156. package/dist/strapi/remote/handlers/push.mjs.map +1 -0
  157. package/dist/strapi/remote/handlers/utils.js +316 -0
  158. package/dist/strapi/remote/handlers/utils.js.map +1 -0
  159. package/dist/strapi/remote/handlers/utils.mjs +310 -0
  160. package/dist/strapi/remote/handlers/utils.mjs.map +1 -0
  161. package/dist/strapi/remote/index.js +10 -0
  162. package/dist/strapi/remote/index.js.map +1 -0
  163. package/dist/strapi/remote/index.mjs +5 -0
  164. package/dist/strapi/remote/index.mjs.map +1 -0
  165. package/dist/utils/components.js +178 -0
  166. package/dist/utils/components.js.map +1 -0
  167. package/dist/utils/components.mjs +171 -0
  168. package/dist/utils/components.mjs.map +1 -0
  169. package/dist/utils/diagnostic.js +51 -0
  170. package/dist/utils/diagnostic.js.map +1 -0
  171. package/dist/utils/diagnostic.mjs +49 -0
  172. package/dist/utils/diagnostic.mjs.map +1 -0
  173. package/dist/utils/encryption/decrypt.js +47 -0
  174. package/dist/utils/encryption/decrypt.js.map +1 -0
  175. package/dist/utils/encryption/decrypt.mjs +45 -0
  176. package/dist/utils/encryption/decrypt.mjs.map +1 -0
  177. package/dist/utils/encryption/encrypt.js +47 -0
  178. package/dist/utils/encryption/encrypt.js.map +1 -0
  179. package/dist/utils/encryption/encrypt.mjs +45 -0
  180. package/dist/utils/encryption/encrypt.mjs.map +1 -0
  181. package/dist/utils/encryption/index.js +10 -0
  182. package/dist/utils/encryption/index.js.map +1 -0
  183. package/dist/utils/encryption/index.mjs +3 -0
  184. package/dist/utils/encryption/index.mjs.map +1 -0
  185. package/dist/utils/index.js +20 -0
  186. package/dist/utils/index.js.map +1 -0
  187. package/dist/utils/index.mjs +15 -0
  188. package/dist/utils/index.mjs.map +1 -0
  189. package/dist/utils/json.js +96 -0
  190. package/dist/utils/json.js.map +1 -0
  191. package/dist/utils/json.mjs +94 -0
  192. package/dist/utils/json.mjs.map +1 -0
  193. package/dist/utils/middleware.js +14 -0
  194. package/dist/utils/middleware.js.map +1 -0
  195. package/dist/utils/middleware.mjs +12 -0
  196. package/dist/utils/middleware.mjs.map +1 -0
  197. package/dist/utils/providers.js +12 -0
  198. package/dist/utils/providers.js.map +1 -0
  199. package/dist/utils/providers.mjs +10 -0
  200. package/dist/utils/providers.mjs.map +1 -0
  201. package/dist/utils/schema.js +32 -0
  202. package/dist/utils/schema.js.map +1 -0
  203. package/dist/utils/schema.mjs +29 -0
  204. package/dist/utils/schema.mjs.map +1 -0
  205. package/dist/utils/stream.js +59 -0
  206. package/dist/utils/stream.js.map +1 -0
  207. package/dist/utils/stream.mjs +55 -0
  208. package/dist/utils/stream.mjs.map +1 -0
  209. package/dist/utils/transaction.js +93 -0
  210. package/dist/utils/transaction.js.map +1 -0
  211. package/dist/utils/transaction.mjs +91 -0
  212. package/dist/utils/transaction.mjs.map +1 -0
  213. package/package.json +5 -5
@@ -0,0 +1,390 @@
1
+ import { randomUUID } from 'crypto';
2
+ import { Writable } from 'stream';
3
+ import { once } from 'lodash/fp';
4
+ import { trimTrailingSlash, connectToWebsocket, createDispatcher } from '../utils.mjs';
5
+ import { TRANSFER_PATH } from '../../remote/constants.mjs';
6
+ import { ProviderTransferError, ProviderValidationError } from '../../../errors/providers.mjs';
7
+
8
+ function _class_private_field_loose_base(receiver, privateKey) {
9
+ if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) {
10
+ throw new TypeError("attempted to use private field on non-instance");
11
+ }
12
+ return receiver;
13
+ }
14
+ var id = 0;
15
+ function _class_private_field_loose_key(name) {
16
+ return "__private_" + id++ + "_" + name;
17
+ }
18
+ const jsonLength = (obj)=>Buffer.byteLength(JSON.stringify(obj));
19
+ 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");
20
+ class RemoteStrapiDestinationProvider {
21
+ resetStats() {
22
+ this.stats = {
23
+ assets: {
24
+ count: 0
25
+ },
26
+ entities: {
27
+ count: 0
28
+ },
29
+ links: {
30
+ count: 0
31
+ },
32
+ configuration: {
33
+ count: 0
34
+ }
35
+ };
36
+ }
37
+ async initTransfer() {
38
+ const { strategy, restore } = this.options;
39
+ const query = this.dispatcher?.dispatchCommand({
40
+ command: 'init',
41
+ params: {
42
+ options: {
43
+ strategy,
44
+ restore
45
+ },
46
+ transfer: 'push'
47
+ }
48
+ });
49
+ const res = await query;
50
+ if (!res?.transferID) {
51
+ throw new ProviderTransferError('Init failed, invalid response from the server');
52
+ }
53
+ this.resetStats();
54
+ return res.transferID;
55
+ }
56
+ async bootstrap(diagnostics) {
57
+ _class_private_field_loose_base(this, _diagnostics)[_diagnostics] = diagnostics;
58
+ const { url, auth } = this.options;
59
+ const validProtocols = [
60
+ 'https:',
61
+ 'http:'
62
+ ];
63
+ let ws;
64
+ if (!validProtocols.includes(url.protocol)) {
65
+ throw new ProviderValidationError(`Invalid protocol "${url.protocol}"`, {
66
+ check: 'url',
67
+ details: {
68
+ protocol: url.protocol,
69
+ validProtocols
70
+ }
71
+ });
72
+ }
73
+ const wsProtocol = url.protocol === 'https:' ? 'wss:' : 'ws:';
74
+ const wsUrl = `${wsProtocol}//${url.host}${trimTrailingSlash(url.pathname)}${TRANSFER_PATH}/push`;
75
+ _class_private_field_loose_base(this, _reportInfo)[_reportInfo]('establishing websocket connection');
76
+ // No auth defined, trying public access for transfer
77
+ if (!auth) {
78
+ ws = await connectToWebsocket(wsUrl, undefined, _class_private_field_loose_base(this, _diagnostics)[_diagnostics]);
79
+ } else if (auth.type === 'token') {
80
+ const headers = {
81
+ Authorization: `Bearer ${auth.token}`
82
+ };
83
+ ws = await connectToWebsocket(wsUrl, {
84
+ headers
85
+ }, _class_private_field_loose_base(this, _diagnostics)[_diagnostics]);
86
+ } else {
87
+ throw new ProviderValidationError('Auth method not available', {
88
+ check: 'auth.type',
89
+ details: {
90
+ auth: auth.type
91
+ }
92
+ });
93
+ }
94
+ _class_private_field_loose_base(this, _reportInfo)[_reportInfo]('established websocket connection');
95
+ this.ws = ws;
96
+ const { retryMessageOptions } = this.options;
97
+ _class_private_field_loose_base(this, _reportInfo)[_reportInfo]('creating dispatcher');
98
+ this.dispatcher = createDispatcher(this.ws, retryMessageOptions, (message)=>_class_private_field_loose_base(this, _reportInfo)[_reportInfo](message));
99
+ _class_private_field_loose_base(this, _reportInfo)[_reportInfo]('created dispatcher');
100
+ _class_private_field_loose_base(this, _reportInfo)[_reportInfo]('initialize transfer');
101
+ this.transferID = await this.initTransfer();
102
+ _class_private_field_loose_base(this, _reportInfo)[_reportInfo](`initialized transfer ${this.transferID}`);
103
+ this.dispatcher.setTransferProperties({
104
+ id: this.transferID,
105
+ kind: 'push'
106
+ });
107
+ await this.dispatcher.dispatchTransferAction('bootstrap');
108
+ }
109
+ async close() {
110
+ // Gracefully close the remote transfer process
111
+ if (this.transferID && this.dispatcher) {
112
+ await this.dispatcher.dispatchTransferAction('close');
113
+ await this.dispatcher.dispatchCommand({
114
+ command: 'end',
115
+ params: {
116
+ transferID: this.transferID
117
+ }
118
+ });
119
+ }
120
+ await new Promise((resolve)=>{
121
+ const { ws } = this;
122
+ if (!ws || ws.CLOSED) {
123
+ resolve();
124
+ return;
125
+ }
126
+ ws.on('close', ()=>resolve()).close();
127
+ });
128
+ }
129
+ getMetadata() {
130
+ return this.dispatcher?.dispatchTransferAction('getMetadata') ?? null;
131
+ }
132
+ async beforeTransfer() {
133
+ await this.dispatcher?.dispatchTransferAction('beforeTransfer');
134
+ }
135
+ async rollback() {
136
+ await this.dispatcher?.dispatchTransferAction('rollback');
137
+ }
138
+ getSchemas() {
139
+ if (!this.dispatcher) {
140
+ return Promise.resolve(null);
141
+ }
142
+ return this.dispatcher.dispatchTransferAction('getSchemas');
143
+ }
144
+ createEntitiesWriteStream() {
145
+ return _class_private_field_loose_base(this, _writeStream)[_writeStream]('entities');
146
+ }
147
+ createLinksWriteStream() {
148
+ return _class_private_field_loose_base(this, _writeStream)[_writeStream]('links');
149
+ }
150
+ createConfigurationWriteStream() {
151
+ return _class_private_field_loose_base(this, _writeStream)[_writeStream]('configuration');
152
+ }
153
+ createAssetsWriteStream() {
154
+ let batch = [];
155
+ let hasStarted = false;
156
+ const batchSize = 1024 * 1024; // 1MB;
157
+ const batchLength = ()=>{
158
+ return batch.reduce((acc, chunk)=>chunk.action === 'stream' ? acc + chunk.data.byteLength : acc, 0);
159
+ };
160
+ const startAssetsTransferOnce = _class_private_field_loose_base(this, _startStepOnce)[_startStepOnce]('assets');
161
+ const flush = async ()=>{
162
+ const streamError = await _class_private_field_loose_base(this, _streamStep)[_streamStep]('assets', batch);
163
+ batch = [];
164
+ return streamError;
165
+ };
166
+ const safePush = async (chunk)=>{
167
+ batch.push(chunk);
168
+ if (batchLength() >= batchSize) {
169
+ const streamError = await flush();
170
+ if (streamError) {
171
+ throw streamError;
172
+ }
173
+ }
174
+ };
175
+ return new Writable({
176
+ objectMode: true,
177
+ final: async (callback)=>{
178
+ if (batch.length > 0) {
179
+ await flush();
180
+ }
181
+ if (hasStarted) {
182
+ const { error: endStepError } = await _class_private_field_loose_base(this, _endStep)[_endStep]('assets');
183
+ if (endStepError) {
184
+ return callback(endStepError);
185
+ }
186
+ }
187
+ return callback(null);
188
+ },
189
+ async write (asset, _encoding, callback) {
190
+ const startError = await startAssetsTransferOnce();
191
+ if (startError) {
192
+ return callback(startError);
193
+ }
194
+ hasStarted = true;
195
+ const assetID = randomUUID();
196
+ const { filename, filepath, stats, stream, metadata } = asset;
197
+ try {
198
+ await safePush({
199
+ action: 'start',
200
+ assetID,
201
+ data: {
202
+ filename,
203
+ filepath,
204
+ stats,
205
+ metadata
206
+ }
207
+ });
208
+ for await (const chunk of stream){
209
+ await safePush({
210
+ action: 'stream',
211
+ assetID,
212
+ data: chunk
213
+ });
214
+ }
215
+ await safePush({
216
+ action: 'end',
217
+ assetID
218
+ });
219
+ callback();
220
+ } catch (error) {
221
+ if (error instanceof Error) {
222
+ callback(error);
223
+ }
224
+ }
225
+ }
226
+ });
227
+ }
228
+ constructor(options){
229
+ Object.defineProperty(this, _startStepOnce, {
230
+ value: startStepOnce
231
+ });
232
+ Object.defineProperty(this, _startStep, {
233
+ value: startStep
234
+ });
235
+ Object.defineProperty(this, _endStep, {
236
+ value: endStep
237
+ });
238
+ Object.defineProperty(this, _streamStep, {
239
+ value: streamStep
240
+ });
241
+ Object.defineProperty(this, _writeStream, {
242
+ value: writeStream
243
+ });
244
+ Object.defineProperty(this, _reportInfo, {
245
+ value: reportInfo
246
+ });
247
+ Object.defineProperty(this, _diagnostics, {
248
+ writable: true,
249
+ value: void 0
250
+ });
251
+ this.name = 'destination::remote-strapi';
252
+ this.type = 'destination';
253
+ this.options = options;
254
+ this.ws = null;
255
+ this.dispatcher = null;
256
+ this.transferID = null;
257
+ this.resetStats();
258
+ }
259
+ }
260
+ function startStepOnce(stage) {
261
+ return once(()=>_class_private_field_loose_base(this, _startStep)[_startStep](stage));
262
+ }
263
+ async function startStep(step) {
264
+ try {
265
+ await this.dispatcher?.dispatchTransferStep({
266
+ action: 'start',
267
+ step
268
+ });
269
+ } catch (e) {
270
+ if (e instanceof Error) {
271
+ return e;
272
+ }
273
+ if (typeof e === 'string') {
274
+ return new ProviderTransferError(e);
275
+ }
276
+ return new ProviderTransferError('Unexpected error');
277
+ }
278
+ this.stats[step] = {
279
+ count: 0
280
+ };
281
+ return null;
282
+ }
283
+ async function endStep(step) {
284
+ try {
285
+ const res = await this.dispatcher?.dispatchTransferStep({
286
+ action: 'end',
287
+ step
288
+ });
289
+ return {
290
+ stats: res?.stats ?? null,
291
+ error: null
292
+ };
293
+ } catch (e) {
294
+ if (e instanceof Error) {
295
+ return {
296
+ stats: null,
297
+ error: e
298
+ };
299
+ }
300
+ if (typeof e === 'string') {
301
+ return {
302
+ stats: null,
303
+ error: new ProviderTransferError(e)
304
+ };
305
+ }
306
+ return {
307
+ stats: null,
308
+ error: new ProviderTransferError('Unexpected error')
309
+ };
310
+ }
311
+ }
312
+ async function streamStep(step, message) {
313
+ try {
314
+ if (step === 'assets') {
315
+ const assetMessage = message;
316
+ this.stats[step].count += assetMessage.filter((data)=>data.action === 'start').length;
317
+ } else {
318
+ this.stats[step].count += message.length;
319
+ }
320
+ await this.dispatcher?.dispatchTransferStep({
321
+ action: 'stream',
322
+ step,
323
+ data: message
324
+ });
325
+ } catch (e) {
326
+ if (e instanceof Error) {
327
+ return e;
328
+ }
329
+ if (typeof e === 'string') {
330
+ return new ProviderTransferError(e);
331
+ }
332
+ return new ProviderTransferError('Unexpected error');
333
+ }
334
+ return null;
335
+ }
336
+ function writeStream(step) {
337
+ const batchSize = 1024 * 1024; // 1MB;
338
+ const startTransferOnce = _class_private_field_loose_base(this, _startStepOnce)[_startStepOnce](step);
339
+ let batch = [];
340
+ const batchLength = ()=>jsonLength(batch);
341
+ return new Writable({
342
+ objectMode: true,
343
+ final: async (callback)=>{
344
+ if (batch.length > 0) {
345
+ const streamError = await _class_private_field_loose_base(this, _streamStep)[_streamStep](step, batch);
346
+ batch = [];
347
+ if (streamError) {
348
+ return callback(streamError);
349
+ }
350
+ }
351
+ const { error, stats } = await _class_private_field_loose_base(this, _endStep)[_endStep](step);
352
+ const { count } = this.stats[step];
353
+ if (stats && (stats.started !== count || stats.finished !== count)) {
354
+ callback(new Error(`Data missing: sent ${this.stats[step].count} ${step}, recieved ${stats.started} and saved ${stats.finished} ${step}`));
355
+ }
356
+ callback(error);
357
+ },
358
+ write: async (chunk, _encoding, callback)=>{
359
+ const startError = await startTransferOnce();
360
+ if (startError) {
361
+ return callback(startError);
362
+ }
363
+ batch.push(chunk);
364
+ if (batchLength() >= batchSize) {
365
+ const streamError = await _class_private_field_loose_base(this, _streamStep)[_streamStep](step, batch);
366
+ batch = [];
367
+ if (streamError) {
368
+ return callback(streamError);
369
+ }
370
+ }
371
+ callback();
372
+ }
373
+ });
374
+ }
375
+ function reportInfo(message) {
376
+ _class_private_field_loose_base(this, _diagnostics)[_diagnostics]?.report({
377
+ details: {
378
+ createdAt: new Date(),
379
+ message,
380
+ origin: 'remote-destination-provider'
381
+ },
382
+ kind: 'info'
383
+ });
384
+ }
385
+ const createRemoteStrapiDestinationProvider = (options)=>{
386
+ return new RemoteStrapiDestinationProvider(options);
387
+ };
388
+
389
+ export { createRemoteStrapiDestinationProvider };
390
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","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}, recieved ${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","reportInfo","connectToWebsocket","undefined","type","headers","Authorization","token","retryMessageOptions","createDispatcher","message","setTransferProperties","id","kind","dispatchTransferAction","close","Promise","resolve","CLOSED","on","getMetadata","beforeTransfer","rollback","getSchemas","createEntitiesWriteStream","writeStream","createLinksWriteStream","createConfigurationWriteStream","createAssetsWriteStream","batch","hasStarted","batchSize","batchLength","reduce","acc","chunk","action","data","startAssetsTransferOnce","startStepOnce","flush","streamError","streamStep","safePush","push","Writable","objectMode","final","callback","length","error","endStepError","endStep","write","asset","_encoding","startError","assetID","randomUUID","filename","filepath","stream","metadata","Error","constructor","name","stage","once","startStep","step","dispatchTransferStep","e","assetMessage","filter","startTransferOnce","started","finished","report","createdAt","Date","origin","createRemoteStrapiDestinationProvider"],"mappings":"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"}