@strapi/data-transfer 5.12.1 → 5.12.3

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,392 @@
1
+ 'use strict';
2
+
3
+ var crypto = require('crypto');
4
+ var stream = require('stream');
5
+ var fp = require('lodash/fp');
6
+ var utils = require('../utils.js');
7
+ var constants = require('../../remote/constants.js');
8
+ var providers = require('../../../errors/providers.js');
9
+
10
+ function _class_private_field_loose_base(receiver, privateKey) {
11
+ if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) {
12
+ throw new TypeError("attempted to use private field on non-instance");
13
+ }
14
+ return receiver;
15
+ }
16
+ var id = 0;
17
+ function _class_private_field_loose_key(name) {
18
+ return "__private_" + id++ + "_" + name;
19
+ }
20
+ const jsonLength = (obj)=>Buffer.byteLength(JSON.stringify(obj));
21
+ var _diagnostics = /*#__PURE__*/ _class_private_field_loose_key("_diagnostics"), _startStepOnce = /*#__PURE__*/ _class_private_field_loose_key("_startStepOnce"), _startStep = /*#__PURE__*/ _class_private_field_loose_key("_startStep"), _endStep = /*#__PURE__*/ _class_private_field_loose_key("_endStep"), _streamStep = /*#__PURE__*/ _class_private_field_loose_key("_streamStep"), _writeStream = /*#__PURE__*/ _class_private_field_loose_key("_writeStream"), _reportInfo = /*#__PURE__*/ _class_private_field_loose_key("_reportInfo");
22
+ class RemoteStrapiDestinationProvider {
23
+ resetStats() {
24
+ this.stats = {
25
+ assets: {
26
+ count: 0
27
+ },
28
+ entities: {
29
+ count: 0
30
+ },
31
+ links: {
32
+ count: 0
33
+ },
34
+ configuration: {
35
+ count: 0
36
+ }
37
+ };
38
+ }
39
+ async initTransfer() {
40
+ const { strategy, restore } = this.options;
41
+ const query = this.dispatcher?.dispatchCommand({
42
+ command: 'init',
43
+ params: {
44
+ options: {
45
+ strategy,
46
+ restore
47
+ },
48
+ transfer: 'push'
49
+ }
50
+ });
51
+ const res = await query;
52
+ if (!res?.transferID) {
53
+ throw new providers.ProviderTransferError('Init failed, invalid response from the server');
54
+ }
55
+ this.resetStats();
56
+ return res.transferID;
57
+ }
58
+ async bootstrap(diagnostics) {
59
+ _class_private_field_loose_base(this, _diagnostics)[_diagnostics] = diagnostics;
60
+ const { url, auth } = this.options;
61
+ const validProtocols = [
62
+ 'https:',
63
+ 'http:'
64
+ ];
65
+ let ws;
66
+ if (!validProtocols.includes(url.protocol)) {
67
+ throw new providers.ProviderValidationError(`Invalid protocol "${url.protocol}"`, {
68
+ check: 'url',
69
+ details: {
70
+ protocol: url.protocol,
71
+ validProtocols
72
+ }
73
+ });
74
+ }
75
+ const wsProtocol = url.protocol === 'https:' ? 'wss:' : 'ws:';
76
+ const wsUrl = `${wsProtocol}//${url.host}${utils.trimTrailingSlash(url.pathname)}${constants.TRANSFER_PATH}/push`;
77
+ _class_private_field_loose_base(this, _reportInfo)[_reportInfo]('establishing websocket connection');
78
+ // No auth defined, trying public access for transfer
79
+ if (!auth) {
80
+ ws = await utils.connectToWebsocket(wsUrl, undefined, _class_private_field_loose_base(this, _diagnostics)[_diagnostics]);
81
+ } else if (auth.type === 'token') {
82
+ const headers = {
83
+ Authorization: `Bearer ${auth.token}`
84
+ };
85
+ ws = await utils.connectToWebsocket(wsUrl, {
86
+ headers
87
+ }, _class_private_field_loose_base(this, _diagnostics)[_diagnostics]);
88
+ } else {
89
+ throw new providers.ProviderValidationError('Auth method not available', {
90
+ check: 'auth.type',
91
+ details: {
92
+ auth: auth.type
93
+ }
94
+ });
95
+ }
96
+ _class_private_field_loose_base(this, _reportInfo)[_reportInfo]('established websocket connection');
97
+ this.ws = ws;
98
+ const { retryMessageOptions } = this.options;
99
+ _class_private_field_loose_base(this, _reportInfo)[_reportInfo]('creating dispatcher');
100
+ this.dispatcher = utils.createDispatcher(this.ws, retryMessageOptions, (message)=>_class_private_field_loose_base(this, _reportInfo)[_reportInfo](message));
101
+ _class_private_field_loose_base(this, _reportInfo)[_reportInfo]('created dispatcher');
102
+ _class_private_field_loose_base(this, _reportInfo)[_reportInfo]('initialize transfer');
103
+ this.transferID = await this.initTransfer();
104
+ _class_private_field_loose_base(this, _reportInfo)[_reportInfo](`initialized transfer ${this.transferID}`);
105
+ this.dispatcher.setTransferProperties({
106
+ id: this.transferID,
107
+ kind: 'push'
108
+ });
109
+ await this.dispatcher.dispatchTransferAction('bootstrap');
110
+ }
111
+ async close() {
112
+ // Gracefully close the remote transfer process
113
+ if (this.transferID && this.dispatcher) {
114
+ await this.dispatcher.dispatchTransferAction('close');
115
+ await this.dispatcher.dispatchCommand({
116
+ command: 'end',
117
+ params: {
118
+ transferID: this.transferID
119
+ }
120
+ });
121
+ }
122
+ await new Promise((resolve)=>{
123
+ const { ws } = this;
124
+ if (!ws || ws.CLOSED) {
125
+ resolve();
126
+ return;
127
+ }
128
+ ws.on('close', ()=>resolve()).close();
129
+ });
130
+ }
131
+ getMetadata() {
132
+ return this.dispatcher?.dispatchTransferAction('getMetadata') ?? null;
133
+ }
134
+ async beforeTransfer() {
135
+ await this.dispatcher?.dispatchTransferAction('beforeTransfer');
136
+ }
137
+ async rollback() {
138
+ await this.dispatcher?.dispatchTransferAction('rollback');
139
+ }
140
+ getSchemas() {
141
+ if (!this.dispatcher) {
142
+ return Promise.resolve(null);
143
+ }
144
+ return this.dispatcher.dispatchTransferAction('getSchemas');
145
+ }
146
+ createEntitiesWriteStream() {
147
+ return _class_private_field_loose_base(this, _writeStream)[_writeStream]('entities');
148
+ }
149
+ createLinksWriteStream() {
150
+ return _class_private_field_loose_base(this, _writeStream)[_writeStream]('links');
151
+ }
152
+ createConfigurationWriteStream() {
153
+ return _class_private_field_loose_base(this, _writeStream)[_writeStream]('configuration');
154
+ }
155
+ createAssetsWriteStream() {
156
+ let batch = [];
157
+ let hasStarted = false;
158
+ const batchSize = 1024 * 1024; // 1MB;
159
+ const batchLength = ()=>{
160
+ return batch.reduce((acc, chunk)=>chunk.action === 'stream' ? acc + chunk.data.byteLength : acc, 0);
161
+ };
162
+ const startAssetsTransferOnce = _class_private_field_loose_base(this, _startStepOnce)[_startStepOnce]('assets');
163
+ const flush = async ()=>{
164
+ const streamError = await _class_private_field_loose_base(this, _streamStep)[_streamStep]('assets', batch);
165
+ batch = [];
166
+ return streamError;
167
+ };
168
+ const safePush = async (chunk)=>{
169
+ batch.push(chunk);
170
+ if (batchLength() >= batchSize) {
171
+ const streamError = await flush();
172
+ if (streamError) {
173
+ throw streamError;
174
+ }
175
+ }
176
+ };
177
+ return new stream.Writable({
178
+ objectMode: true,
179
+ final: async (callback)=>{
180
+ if (batch.length > 0) {
181
+ await flush();
182
+ }
183
+ if (hasStarted) {
184
+ const { error: endStepError } = await _class_private_field_loose_base(this, _endStep)[_endStep]('assets');
185
+ if (endStepError) {
186
+ return callback(endStepError);
187
+ }
188
+ }
189
+ return callback(null);
190
+ },
191
+ async write (asset, _encoding, callback) {
192
+ const startError = await startAssetsTransferOnce();
193
+ if (startError) {
194
+ return callback(startError);
195
+ }
196
+ hasStarted = true;
197
+ const assetID = crypto.randomUUID();
198
+ const { filename, filepath, stats, stream, metadata } = asset;
199
+ try {
200
+ await safePush({
201
+ action: 'start',
202
+ assetID,
203
+ data: {
204
+ filename,
205
+ filepath,
206
+ stats,
207
+ metadata
208
+ }
209
+ });
210
+ for await (const chunk of stream){
211
+ await safePush({
212
+ action: 'stream',
213
+ assetID,
214
+ data: chunk
215
+ });
216
+ }
217
+ await safePush({
218
+ action: 'end',
219
+ assetID
220
+ });
221
+ callback();
222
+ } catch (error) {
223
+ if (error instanceof Error) {
224
+ callback(error);
225
+ }
226
+ }
227
+ }
228
+ });
229
+ }
230
+ constructor(options){
231
+ Object.defineProperty(this, _startStepOnce, {
232
+ value: startStepOnce
233
+ });
234
+ Object.defineProperty(this, _startStep, {
235
+ value: startStep
236
+ });
237
+ Object.defineProperty(this, _endStep, {
238
+ value: endStep
239
+ });
240
+ Object.defineProperty(this, _streamStep, {
241
+ value: streamStep
242
+ });
243
+ Object.defineProperty(this, _writeStream, {
244
+ value: writeStream
245
+ });
246
+ Object.defineProperty(this, _reportInfo, {
247
+ value: reportInfo
248
+ });
249
+ Object.defineProperty(this, _diagnostics, {
250
+ writable: true,
251
+ value: void 0
252
+ });
253
+ this.name = 'destination::remote-strapi';
254
+ this.type = 'destination';
255
+ this.options = options;
256
+ this.ws = null;
257
+ this.dispatcher = null;
258
+ this.transferID = null;
259
+ this.resetStats();
260
+ }
261
+ }
262
+ function startStepOnce(stage) {
263
+ return fp.once(()=>_class_private_field_loose_base(this, _startStep)[_startStep](stage));
264
+ }
265
+ async function startStep(step) {
266
+ try {
267
+ await this.dispatcher?.dispatchTransferStep({
268
+ action: 'start',
269
+ step
270
+ });
271
+ } catch (e) {
272
+ if (e instanceof Error) {
273
+ return e;
274
+ }
275
+ if (typeof e === 'string') {
276
+ return new providers.ProviderTransferError(e);
277
+ }
278
+ return new providers.ProviderTransferError('Unexpected error');
279
+ }
280
+ this.stats[step] = {
281
+ count: 0
282
+ };
283
+ return null;
284
+ }
285
+ async function endStep(step) {
286
+ try {
287
+ const res = await this.dispatcher?.dispatchTransferStep({
288
+ action: 'end',
289
+ step
290
+ });
291
+ return {
292
+ stats: res?.stats ?? null,
293
+ error: null
294
+ };
295
+ } catch (e) {
296
+ if (e instanceof Error) {
297
+ return {
298
+ stats: null,
299
+ error: e
300
+ };
301
+ }
302
+ if (typeof e === 'string') {
303
+ return {
304
+ stats: null,
305
+ error: new providers.ProviderTransferError(e)
306
+ };
307
+ }
308
+ return {
309
+ stats: null,
310
+ error: new providers.ProviderTransferError('Unexpected error')
311
+ };
312
+ }
313
+ }
314
+ async function streamStep(step, message) {
315
+ try {
316
+ if (step === 'assets') {
317
+ const assetMessage = message;
318
+ this.stats[step].count += assetMessage.filter((data)=>data.action === 'start').length;
319
+ } else {
320
+ this.stats[step].count += message.length;
321
+ }
322
+ await this.dispatcher?.dispatchTransferStep({
323
+ action: 'stream',
324
+ step,
325
+ data: message
326
+ });
327
+ } catch (e) {
328
+ if (e instanceof Error) {
329
+ return e;
330
+ }
331
+ if (typeof e === 'string') {
332
+ return new providers.ProviderTransferError(e);
333
+ }
334
+ return new providers.ProviderTransferError('Unexpected error');
335
+ }
336
+ return null;
337
+ }
338
+ function writeStream(step) {
339
+ const batchSize = 1024 * 1024; // 1MB;
340
+ const startTransferOnce = _class_private_field_loose_base(this, _startStepOnce)[_startStepOnce](step);
341
+ let batch = [];
342
+ const batchLength = ()=>jsonLength(batch);
343
+ return new stream.Writable({
344
+ objectMode: true,
345
+ final: async (callback)=>{
346
+ if (batch.length > 0) {
347
+ const streamError = await _class_private_field_loose_base(this, _streamStep)[_streamStep](step, batch);
348
+ batch = [];
349
+ if (streamError) {
350
+ return callback(streamError);
351
+ }
352
+ }
353
+ const { error, stats } = await _class_private_field_loose_base(this, _endStep)[_endStep](step);
354
+ const { count } = this.stats[step];
355
+ if (stats && (stats.started !== count || stats.finished !== count)) {
356
+ callback(new Error(`Data missing: sent ${this.stats[step].count} ${step}, recieved ${stats.started} and saved ${stats.finished} ${step}`));
357
+ }
358
+ callback(error);
359
+ },
360
+ write: async (chunk, _encoding, callback)=>{
361
+ const startError = await startTransferOnce();
362
+ if (startError) {
363
+ return callback(startError);
364
+ }
365
+ batch.push(chunk);
366
+ if (batchLength() >= batchSize) {
367
+ const streamError = await _class_private_field_loose_base(this, _streamStep)[_streamStep](step, batch);
368
+ batch = [];
369
+ if (streamError) {
370
+ return callback(streamError);
371
+ }
372
+ }
373
+ callback();
374
+ }
375
+ });
376
+ }
377
+ function reportInfo(message) {
378
+ _class_private_field_loose_base(this, _diagnostics)[_diagnostics]?.report({
379
+ details: {
380
+ createdAt: new Date(),
381
+ message,
382
+ origin: 'remote-destination-provider'
383
+ },
384
+ kind: 'info'
385
+ });
386
+ }
387
+ const createRemoteStrapiDestinationProvider = (options)=>{
388
+ return new RemoteStrapiDestinationProvider(options);
389
+ };
390
+
391
+ exports.createRemoteStrapiDestinationProvider = createRemoteStrapiDestinationProvider;
392
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../../src/strapi/providers/remote-destination/index.ts"],"sourcesContent":["import { randomUUID } from 'crypto';\nimport { Writable } from 'stream';\nimport { WebSocket } from 'ws';\nimport { once } from 'lodash/fp';\nimport type { Struct, Utils } from '@strapi/types';\n\nimport { createDispatcher, connectToWebsocket, trimTrailingSlash } from '../utils';\n\nimport type {\n IDestinationProvider,\n IMetadata,\n ProviderType,\n IAsset,\n TransferStage,\n Protocol,\n} from '../../../../types';\nimport type { IDiagnosticReporter } from '../../../utils/diagnostic';\nimport type { Client, Server, Auth } from '../../../../types/remote/protocol';\nimport type { ILocalStrapiDestinationProviderOptions } from '../local-destination';\nimport { TRANSFER_PATH } from '../../remote/constants';\nimport { ProviderTransferError, ProviderValidationError } from '../../../errors/providers';\n\nexport interface IRemoteStrapiDestinationProviderOptions\n extends Pick<ILocalStrapiDestinationProviderOptions, 'restore' | 'strategy'> {\n url: URL; // the url of the remote Strapi admin\n auth?: Auth.ITransferTokenAuth;\n retryMessageOptions?: {\n retryMessageTimeout: number; // milliseconds to wait for a response from a message\n retryMessageMaxRetries: number; // max number of retries for a message before aborting transfer\n };\n}\n\nconst jsonLength = (obj: object) => Buffer.byteLength(JSON.stringify(obj));\n\nclass RemoteStrapiDestinationProvider implements IDestinationProvider {\n name = 'destination::remote-strapi';\n\n type: ProviderType = 'destination';\n\n options: IRemoteStrapiDestinationProviderOptions;\n\n ws: WebSocket | null;\n\n dispatcher: ReturnType<typeof createDispatcher> | null;\n\n transferID: string | null;\n\n stats!: { [TStage in Exclude<TransferStage, 'schemas'>]: { count: number } };\n\n #diagnostics?: IDiagnosticReporter;\n\n constructor(options: IRemoteStrapiDestinationProviderOptions) {\n this.options = options;\n this.ws = null;\n this.dispatcher = null;\n this.transferID = null;\n\n this.resetStats();\n }\n\n private resetStats() {\n this.stats = {\n assets: { count: 0 },\n entities: { count: 0 },\n links: { count: 0 },\n configuration: { count: 0 },\n };\n }\n\n async initTransfer(): Promise<string> {\n const { strategy, restore } = this.options;\n\n const query = this.dispatcher?.dispatchCommand({\n command: 'init',\n params: { options: { strategy, restore }, transfer: 'push' },\n });\n\n const res = (await query) as Server.Payload<Server.InitMessage>;\n if (!res?.transferID) {\n throw new ProviderTransferError('Init failed, invalid response from the server');\n }\n\n this.resetStats();\n\n return res.transferID;\n }\n\n #startStepOnce(stage: Client.TransferPushStep) {\n return once(() => this.#startStep(stage));\n }\n\n async #startStep<T extends Client.TransferPushStep>(step: T) {\n try {\n await this.dispatcher?.dispatchTransferStep({ action: 'start', step });\n } catch (e) {\n if (e instanceof Error) {\n return e;\n }\n\n if (typeof e === 'string') {\n return new ProviderTransferError(e);\n }\n\n return new ProviderTransferError('Unexpected error');\n }\n\n this.stats[step] = { count: 0 };\n\n return null;\n }\n\n async #endStep<T extends Client.TransferPushStep>(step: T) {\n try {\n const res = await this.dispatcher?.dispatchTransferStep<{\n ok: boolean;\n stats: Protocol.Client.Stats;\n }>({\n action: 'end',\n step,\n });\n\n return { stats: res?.stats ?? null, error: null };\n } catch (e) {\n if (e instanceof Error) {\n return { stats: null, error: e };\n }\n\n if (typeof e === 'string') {\n return { stats: null, error: new ProviderTransferError(e) };\n }\n\n return { stats: null, error: new ProviderTransferError('Unexpected error') };\n }\n }\n\n async #streamStep<T extends Client.TransferPushStep>(\n step: T,\n message: Client.GetTransferPushStreamData<T>\n ) {\n try {\n if (step === 'assets') {\n const assetMessage = message as Protocol.Client.TransferAssetFlow[];\n this.stats[step].count += assetMessage.filter((data) => data.action === 'start').length;\n } else {\n this.stats[step].count += message.length;\n }\n\n await this.dispatcher?.dispatchTransferStep({ action: 'stream', step, data: message });\n } catch (e) {\n if (e instanceof Error) {\n return e;\n }\n\n if (typeof e === 'string') {\n return new ProviderTransferError(e);\n }\n\n return new ProviderTransferError('Unexpected error');\n }\n\n return null;\n }\n\n #writeStream(step: Exclude<Client.TransferPushStep, 'assets'>): Writable {\n type Step = typeof step;\n\n const batchSize = 1024 * 1024; // 1MB;\n const startTransferOnce = this.#startStepOnce(step);\n\n let batch = [] as Client.GetTransferPushStreamData<Step>;\n\n const batchLength = () => jsonLength(batch);\n\n return new Writable({\n objectMode: true,\n\n final: async (callback) => {\n if (batch.length > 0) {\n const streamError = await this.#streamStep(step, batch);\n\n batch = [];\n\n if (streamError) {\n return callback(streamError);\n }\n }\n const { error, stats } = await this.#endStep(step);\n\n const { count } = this.stats[step];\n\n if (stats && (stats.started !== count || stats.finished !== count)) {\n callback(\n new Error(\n `Data missing: sent ${this.stats[step].count} ${step}, 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":";;;;;;;;;;;;;;;;;;;AAgCA,MAAMA,UAAAA,GAAa,CAACC,GAAgBC,GAAAA,MAAAA,CAAOC,UAAU,CAACC,IAAAA,CAAKC,SAAS,CAACJ,GAAAA,CAAAA,CAAAA;AAiBnE,IAAA,YAAA,iBAAA,8BAAA,CAAA,cAAA,CAAA,EAsCA,cAIM,iBAAA,8BAAA,CAAA,gBAAA,CAAA,EAAA,UAAA,iBAAA,8BAAA,CAAA,YAAA,CAAA,EAoBA,QAwBA,iBAAA,8BAAA,CAAA,UAAA,CAAA,EAAA,WAAA,iBAAA,8BAAA,CAAA,aAAA,CAAA,EA4BN,YA6DA,iBAAA,8BAAA,CAAA,cAAA,CAAA,EAAA,WAAA,iBAAA,8BAAA,CAAA,aAAA,CAAA;AA9LF,MAAMK,+BAAAA,CAAAA;IA0BIC,UAAa,GAAA;QACnB,IAAI,CAACC,KAAK,GAAG;YACXC,MAAQ,EAAA;gBAAEC,KAAO,EAAA;AAAE,aAAA;YACnBC,QAAU,EAAA;gBAAED,KAAO,EAAA;AAAE,aAAA;YACrBE,KAAO,EAAA;gBAAEF,KAAO,EAAA;AAAE,aAAA;YAClBG,aAAe,EAAA;gBAAEH,KAAO,EAAA;AAAE;AAC5B,SAAA;AACF;AAEA,IAAA,MAAMI,YAAgC,GAAA;QACpC,MAAM,EAAEC,QAAQ,EAAEC,OAAO,EAAE,GAAG,IAAI,CAACC,OAAO;AAE1C,QAAA,MAAMC,KAAQ,GAAA,IAAI,CAACC,UAAU,EAAEC,eAAgB,CAAA;YAC7CC,OAAS,EAAA,MAAA;YACTC,MAAQ,EAAA;gBAAEL,OAAS,EAAA;AAAEF,oBAAAA,QAAAA;AAAUC,oBAAAA;AAAQ,iBAAA;gBAAGO,QAAU,EAAA;AAAO;AAC7D,SAAA,CAAA;AAEA,QAAA,MAAMC,MAAO,MAAMN,KAAAA;QACnB,IAAI,CAACM,KAAKC,UAAY,EAAA;AACpB,YAAA,MAAM,IAAIC,+BAAsB,CAAA,+CAAA,CAAA;AAClC;AAEA,QAAA,IAAI,CAACnB,UAAU,EAAA;AAEf,QAAA,OAAOiB,IAAIC,UAAU;AACvB;IAsJA,MAAME,SAAAA,CAAUC,WAAiC,EAAiB;QAChE,+BAAA,CAAA,IAAI,EAAEA,YAAAA,CAAAA,CAAAA,YAAcA,CAAAA,GAAAA,WAAAA;QACpB,MAAM,EAAEC,GAAG,EAAEC,IAAI,EAAE,GAAG,IAAI,CAACb,OAAO;AAClC,QAAA,MAAMc,cAAiB,GAAA;AAAC,YAAA,QAAA;AAAU,YAAA;AAAQ,SAAA;QAE1C,IAAIC,EAAAA;AAEJ,QAAA,IAAI,CAACD,cAAeE,CAAAA,QAAQ,CAACJ,GAAAA,CAAIK,QAAQ,CAAG,EAAA;YAC1C,MAAM,IAAIC,iCAAwB,CAAA,CAAC,kBAAkB,EAAEN,IAAIK,QAAQ,CAAC,CAAC,CAAC,EAAE;gBACtEE,KAAO,EAAA,KAAA;gBACPC,OAAS,EAAA;AACPH,oBAAAA,QAAAA,EAAUL,IAAIK,QAAQ;AACtBH,oBAAAA;AACF;AACF,aAAA,CAAA;AACF;AACA,QAAA,MAAMO,UAAaT,GAAAA,GAAAA,CAAIK,QAAQ,KAAK,WAAW,MAAS,GAAA,KAAA;AACxD,QAAA,MAAMK,QAAQ,CAAC,EAAED,UAAW,CAAA,EAAE,EAAET,GAAIW,CAAAA,IAAI,CAAC,EAAEC,wBACzCZ,GAAIa,CAAAA,QAAQ,EACZ,EAAEC,uBAAAA,CAAc,KAAK,CAAC;QAExB,+BAAA,CAAA,IAAI,EAAEC,WAAAA,CAAAA,CAAAA,WAAW,CAAA,CAAA,mCAAA,CAAA;;AAEjB,QAAA,IAAI,CAACd,IAAM,EAAA;AACTE,YAAAA,EAAAA,GAAK,MAAMa,wBAAmBN,CAAAA,KAAAA,EAAOO,WAAW,+BAAA,CAAA,IAAI,EAAElB,YAAAA,CAAAA,CAAAA,YAAAA,CAAAA,CAAAA;AACxD,SAAA,MAGK,IAAIE,IAAAA,CAAKiB,IAAI,KAAK,OAAS,EAAA;AAC9B,YAAA,MAAMC,OAAU,GAAA;AAAEC,gBAAAA,aAAAA,EAAe,CAAC,OAAO,EAAEnB,IAAKoB,CAAAA,KAAK,CAAC;AAAE,aAAA;YACxDlB,EAAK,GAAA,MAAMa,yBAAmBN,KAAO,EAAA;AAAES,gBAAAA;aAAW,EAAA,+BAAA,CAAA,IAAI,EAAEpB,YAAAA,CAAAA,CAAAA,YAAAA,CAAAA,CAAAA;SAIrD,MAAA;YACH,MAAM,IAAIO,kCAAwB,2BAA6B,EAAA;gBAC7DC,KAAO,EAAA,WAAA;gBACPC,OAAS,EAAA;AACPP,oBAAAA,IAAAA,EAAMA,KAAKiB;AACb;AACF,aAAA,CAAA;AACF;QAEA,+BAAA,CAAA,IAAI,EAAEH,WAAAA,CAAAA,CAAAA,WAAW,CAAA,CAAA,kCAAA,CAAA;QAEjB,IAAI,CAACZ,EAAE,GAAGA,EAAAA;AACV,QAAA,MAAM,EAAEmB,mBAAmB,EAAE,GAAG,IAAI,CAAClC,OAAO;QAE5C,+BAAA,CAAA,IAAI,EAAE2B,WAAAA,CAAAA,CAAAA,WAAW,CAAA,CAAA,qBAAA,CAAA;AACjB,QAAA,IAAI,CAACzB,UAAU,GAAGiC,sBAAAA,CAAiB,IAAI,CAACpB,EAAE,EAAEmB,mBAAAA,EAAqB,CAACE,OAChE,GAAA,+BAAA,CAAA,IAAI,EAAET,aAAAA,WAAWS,CAAAA,CAAAA,OAAAA,CAAAA,CAAAA;QAEnB,+BAAA,CAAA,IAAI,EAAET,WAAAA,CAAAA,CAAAA,WAAW,CAAA,CAAA,oBAAA,CAAA;QAEjB,+BAAA,CAAA,IAAI,EAAEA,WAAAA,CAAAA,CAAAA,WAAW,CAAA,CAAA,qBAAA,CAAA;AACjB,QAAA,IAAI,CAACnB,UAAU,GAAG,MAAM,IAAI,CAACX,YAAY,EAAA;QACzC,+BAAA,CAAA,IAAI,EAAE8B,WAAAA,CAAAA,CAAAA,WAAW,CAAA,CAAA,CAAC,qBAAqB,EAAE,IAAI,CAACnB,UAAU,CAAC,CAAC,CAAA;AAE1D,QAAA,IAAI,CAACN,UAAU,CAACmC,qBAAqB,CAAC;YAAEC,EAAI,EAAA,IAAI,CAAC9B,UAAU;YAAE+B,IAAM,EAAA;AAAO,SAAA,CAAA;AAE1E,QAAA,MAAM,IAAI,CAACrC,UAAU,CAACsC,sBAAsB,CAAC,WAAA,CAAA;AAC/C;AAEA,IAAA,MAAMC,KAAQ,GAAA;;AAEZ,QAAA,IAAI,IAAI,CAACjC,UAAU,IAAI,IAAI,CAACN,UAAU,EAAE;AACtC,YAAA,MAAM,IAAI,CAACA,UAAU,CAACsC,sBAAsB,CAAC,OAAA,CAAA;AAE7C,YAAA,MAAM,IAAI,CAACtC,UAAU,CAACC,eAAe,CAAC;gBACpCC,OAAS,EAAA,KAAA;gBACTC,MAAQ,EAAA;oBAAEG,UAAY,EAAA,IAAI,CAACA;AAAW;AACxC,aAAA,CAAA;AACF;QAEA,MAAM,IAAIkC,QAAc,CAACC,OAAAA,GAAAA;AACvB,YAAA,MAAM,EAAE5B,EAAE,EAAE,GAAG,IAAI;AAEnB,YAAA,IAAI,CAACA,EAAAA,IAAMA,EAAG6B,CAAAA,MAAM,EAAE;AACpBD,gBAAAA,OAAAA,EAAAA;AACA,gBAAA;AACF;AAEA5B,YAAAA,EAAAA,CAAG8B,EAAE,CAAC,OAAS,EAAA,IAAMF,WAAWF,KAAK,EAAA;AACvC,SAAA,CAAA;AACF;IAEAK,WAAc,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC5C,UAAU,EAAEsC,uBAAkC,aAAkB,CAAA,IAAA,IAAA;AAC9E;AAEA,IAAA,MAAMO,cAAiB,GAAA;AACrB,QAAA,MAAM,IAAI,CAAC7C,UAAU,EAAEsC,sBAAuB,CAAA,gBAAA,CAAA;AAChD;AAEA,IAAA,MAAMQ,QAAW,GAAA;AACf,QAAA,MAAM,IAAI,CAAC9C,UAAU,EAAEsC,sBAAuB,CAAA,UAAA,CAAA;AAChD;IAEAS,UAAa,GAAA;AACX,QAAA,IAAI,CAAC,IAAI,CAAC/C,UAAU,EAAE;YACpB,OAAOwC,OAAAA,CAAQC,OAAO,CAAC,IAAA,CAAA;AACzB;AAEA,QAAA,OAAO,IAAI,CAACzC,UAAU,CAACsC,sBAAsB,CAAmC,YAAA,CAAA;AAClF;IAEAU,yBAAsC,GAAA;AACpC,QAAA,OAAO,+BAAA,CAAA,IAAI,EAAEC,YAAAA,CAAAA,CAAAA,YAAY,CAAA,CAAA,UAAA,CAAA;AAC3B;IAEAC,sBAAmC,GAAA;AACjC,QAAA,OAAO,+BAAA,CAAA,IAAI,EAAED,YAAAA,CAAAA,CAAAA,YAAY,CAAA,CAAA,OAAA,CAAA;AAC3B;IAEAE,8BAA2C,GAAA;AACzC,QAAA,OAAO,+BAAA,CAAA,IAAI,EAAEF,YAAAA,CAAAA,CAAAA,YAAY,CAAA,CAAA,eAAA,CAAA;AAC3B;IAEAG,uBAAwD,GAAA;AACtD,QAAA,IAAIC,QAAoC,EAAE;AAC1C,QAAA,IAAIC,UAAa,GAAA,KAAA;QAEjB,MAAMC,SAAAA,GAAY,IAAO,GAAA,IAAA,CAAA;AACzB,QAAA,MAAMC,WAAc,GAAA,IAAA;AAClB,YAAA,OAAOH,MAAMI,MAAM,CACjB,CAACC,GAAAA,EAAKC,QAAWA,KAAMC,CAAAA,MAAM,KAAK,QAAA,GAAWF,MAAMC,KAAME,CAAAA,IAAI,CAAC7E,UAAU,GAAG0E,GAC3E,EAAA,CAAA,CAAA;AAEJ,SAAA;AACA,QAAA,MAAMI,uBAA0B,GAAA,+BAAA,CAAA,IAAI,EAAEC,gBAAAA,cAAc,CAAA,CAAA,QAAA,CAAA;AAEpD,QAAA,MAAMC,KAAQ,GAAA,UAAA;AACZ,YAAA,MAAMC,cAAc,MAAM,+BAAA,CAAA,IAAI,EAAEC,WAAAA,CAAAA,CAAAA,aAAW,QAAUb,EAAAA,KAAAA,CAAAA;AACrDA,YAAAA,KAAAA,GAAQ,EAAE;YACV,OAAOY,WAAAA;AACT,SAAA;AAEA,QAAA,MAAME,WAAW,OAAOR,KAAAA,GAAAA;AACtBN,YAAAA,KAAAA,CAAMe,IAAI,CAACT,KAAAA,CAAAA;AAEX,YAAA,IAAIH,iBAAiBD,SAAW,EAAA;AAC9B,gBAAA,MAAMU,cAAc,MAAMD,KAAAA,EAAAA;AAC1B,gBAAA,IAAIC,WAAa,EAAA;oBACf,MAAMA,WAAAA;AACR;AACF;AACF,SAAA;AAEA,QAAA,OAAO,IAAII,eAAS,CAAA;YAClBC,UAAY,EAAA,IAAA;AACZC,YAAAA,KAAAA,EAAO,OAAOC,QAAAA,GAAAA;gBACZ,IAAInB,KAAAA,CAAMoB,MAAM,GAAG,CAAG,EAAA;oBACpB,MAAMT,KAAAA,EAAAA;AACR;AAEA,gBAAA,IAAIV,UAAY,EAAA;oBACd,MAAM,EAAEoB,KAAOC,EAAAA,YAAY,EAAE,GAAG,MAAM,+BAAA,CAAA,IAAI,EAAEC,QAAAA,CAAAA,CAAAA,QAAQ,CAAA,CAAA,QAAA,CAAA;AAEpD,oBAAA,IAAID,YAAc,EAAA;AAChB,wBAAA,OAAOH,QAASG,CAAAA,YAAAA,CAAAA;AAClB;AACF;AAEA,gBAAA,OAAOH,QAAS,CAAA,IAAA,CAAA;AAClB,aAAA;AAEA,YAAA,MAAMK,KAAMC,CAAAA,CAAAA,KAAa,EAAEC,SAAS,EAAEP,QAAQ,EAAA;AAC5C,gBAAA,MAAMQ,aAAa,MAAMlB,uBAAAA,EAAAA;AACzB,gBAAA,IAAIkB,UAAY,EAAA;AACd,oBAAA,OAAOR,QAASQ,CAAAA,UAAAA,CAAAA;AAClB;gBAEA1B,UAAa,GAAA,IAAA;AAEb,gBAAA,MAAM2B,OAAUC,GAAAA,iBAAAA,EAAAA;gBAChB,MAAM,EAAEC,QAAQ,EAAEC,QAAQ,EAAE/F,KAAK,EAAEgG,MAAM,EAAEC,QAAQ,EAAE,GAAGR,KAAAA;gBAExD,IAAI;AACF,oBAAA,MAAMX,QAAS,CAAA;wBACbP,MAAQ,EAAA,OAAA;AACRqB,wBAAAA,OAAAA;wBACApB,IAAM,EAAA;AAAEsB,4BAAAA,QAAAA;AAAUC,4BAAAA,QAAAA;AAAU/F,4BAAAA,KAAAA;AAAOiG,4BAAAA;AAAS;AAC9C,qBAAA,CAAA;oBAEA,WAAW,MAAM3B,SAAS0B,MAAQ,CAAA;AAChC,wBAAA,MAAMlB,QAAS,CAAA;4BAAEP,MAAQ,EAAA,QAAA;AAAUqB,4BAAAA,OAAAA;4BAASpB,IAAMF,EAAAA;AAAM,yBAAA,CAAA;AAC1D;AAEA,oBAAA,MAAMQ,QAAS,CAAA;wBAAEP,MAAQ,EAAA,KAAA;AAAOqB,wBAAAA;AAAQ,qBAAA,CAAA;AAExCT,oBAAAA,QAAAA,EAAAA;AACF,iBAAA,CAAE,OAAOE,KAAO,EAAA;AACd,oBAAA,IAAIA,iBAAiBa,KAAO,EAAA;wBAC1Bf,QAASE,CAAAA,KAAAA,CAAAA;AACX;AACF;AACF;AACF,SAAA,CAAA;AACF;AA9XAc,IAAAA,WAAAA,CAAY1F,OAAgD,CAAE;QAoC9D,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,cAAA,EAAA;AAAA,YAAA,KAAA,EAAA;;QAIA,MAAM,CAAA,cAAA,CAAA,IAAA,EAAA,UAAA,EAAA;AAAN,YAAA,KAAA,EAAA;;QAoBA,MAAM,CAAA,cAAA,CAAA,IAAA,EAAA,QAAA,EAAA;AAAN,YAAA,KAAA,EAAA;;QAwBA,MAAM,CAAA,cAAA,CAAA,IAAA,EAAA,WAAA,EAAA;AAAN,YAAA,KAAA,EAAA;;QA4BA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,YAAA,EAAA;AAAA,YAAA,KAAA,EAAA;;QA6DA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,WAAA,EAAA;AAAA,YAAA,KAAA,EAAA;;QA/KA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,YAAA,EAAA;;mBAAA,KAAA;;aAdA2F,IAAO,GAAA,4BAAA;aAEP7D,IAAqB,GAAA,aAAA;QAenB,IAAI,CAAC9B,OAAO,GAAGA,OAAAA;QACf,IAAI,CAACe,EAAE,GAAG,IAAA;QACV,IAAI,CAACb,UAAU,GAAG,IAAA;QAClB,IAAI,CAACM,UAAU,GAAG,IAAA;AAElB,QAAA,IAAI,CAAClB,UAAU,EAAA;AACjB;AAwXF;AA3VE,SAAA,cAAesG,KAA8B,EAAA;AAC3C,IAAA,OAAOC,QAAK,IAAM,+BAAA,CAAA,IAAI,EAAEC,YAAAA,UAAUF,CAAAA,CAAAA,KAAAA,CAAAA,CAAAA;AACpC;AAEA,eAAA,UAAoDG,IAAO,EAAA;IACzD,IAAI;AACF,QAAA,MAAM,IAAI,CAAC7F,UAAU,EAAE8F,oBAAqB,CAAA;YAAElC,MAAQ,EAAA,OAAA;AAASiC,YAAAA;AAAK,SAAA,CAAA;AACtE,KAAA,CAAE,OAAOE,CAAG,EAAA;AACV,QAAA,IAAIA,aAAaR,KAAO,EAAA;YACtB,OAAOQ,CAAAA;AACT;QAEA,IAAI,OAAOA,MAAM,QAAU,EAAA;AACzB,YAAA,OAAO,IAAIxF,+BAAsBwF,CAAAA,CAAAA,CAAAA;AACnC;AAEA,QAAA,OAAO,IAAIxF,+BAAsB,CAAA,kBAAA,CAAA;AACnC;AAEA,IAAA,IAAI,CAAClB,KAAK,CAACwG,IAAAA,CAAK,GAAG;QAAEtG,KAAO,EAAA;AAAE,KAAA;IAE9B,OAAO,IAAA;AACT;AAEA,eAAA,QAAkDsG,IAAO,EAAA;IACvD,IAAI;AACF,QAAA,MAAMxF,MAAM,MAAM,IAAI,CAACL,UAAU,EAAE8F,oBAGhC,CAAA;YACDlC,MAAQ,EAAA,KAAA;AACRiC,YAAAA;AACF,SAAA,CAAA;QAEA,OAAO;AAAExG,YAAAA,KAAAA,EAAOgB,KAAKhB,KAAS,IAAA,IAAA;YAAMqF,KAAO,EAAA;AAAK,SAAA;AAClD,KAAA,CAAE,OAAOqB,CAAG,EAAA;AACV,QAAA,IAAIA,aAAaR,KAAO,EAAA;YACtB,OAAO;gBAAElG,KAAO,EAAA,IAAA;gBAAMqF,KAAOqB,EAAAA;AAAE,aAAA;AACjC;QAEA,IAAI,OAAOA,MAAM,QAAU,EAAA;YACzB,OAAO;gBAAE1G,KAAO,EAAA,IAAA;AAAMqF,gBAAAA,KAAAA,EAAO,IAAInE,+BAAsBwF,CAAAA,CAAAA;AAAG,aAAA;AAC5D;QAEA,OAAO;YAAE1G,KAAO,EAAA,IAAA;AAAMqF,YAAAA,KAAAA,EAAO,IAAInE,+BAAsB,CAAA,kBAAA;AAAoB,SAAA;AAC7E;AACF;AAEA,eAAA,UAAA,CACEsF,IAAO,EACP3D,OAA4C,EAAA;IAE5C,IAAI;AACF,QAAA,IAAI2D,SAAS,QAAU,EAAA;AACrB,YAAA,MAAMG,YAAe9D,GAAAA,OAAAA;AACrB,YAAA,IAAI,CAAC7C,KAAK,CAACwG,IAAK,CAAA,CAACtG,KAAK,IAAIyG,YAAAA,CAAaC,MAAM,CAAC,CAACpC,IAASA,GAAAA,IAAAA,CAAKD,MAAM,KAAK,SAASa,MAAM;SAClF,MAAA;YACL,IAAI,CAACpF,KAAK,CAACwG,IAAAA,CAAK,CAACtG,KAAK,IAAI2C,QAAQuC,MAAM;AAC1C;AAEA,QAAA,MAAM,IAAI,CAACzE,UAAU,EAAE8F,oBAAqB,CAAA;YAAElC,MAAQ,EAAA,QAAA;AAAUiC,YAAAA,IAAAA;YAAMhC,IAAM3B,EAAAA;AAAQ,SAAA,CAAA;AACtF,KAAA,CAAE,OAAO6D,CAAG,EAAA;AACV,QAAA,IAAIA,aAAaR,KAAO,EAAA;YACtB,OAAOQ,CAAAA;AACT;QAEA,IAAI,OAAOA,MAAM,QAAU,EAAA;AACzB,YAAA,OAAO,IAAIxF,+BAAsBwF,CAAAA,CAAAA,CAAAA;AACnC;AAEA,QAAA,OAAO,IAAIxF,+BAAsB,CAAA,kBAAA,CAAA;AACnC;IAEA,OAAO,IAAA;AACT;AAEA,SAAA,YAAasF,IAAgD,EAAA;IAG3D,MAAMtC,SAAAA,GAAY,IAAO,GAAA,IAAA,CAAA;AACzB,IAAA,MAAM2C,iBAAoB,GAAA,+BAAA,CAAA,IAAI,EAAEnC,gBAAAA,cAAc8B,CAAAA,CAAAA,IAAAA,CAAAA;AAE9C,IAAA,IAAIxC,QAAQ,EAAE;IAEd,MAAMG,WAAAA,GAAc,IAAM3E,UAAWwE,CAAAA,KAAAA,CAAAA;AAErC,IAAA,OAAO,IAAIgB,eAAS,CAAA;QAClBC,UAAY,EAAA,IAAA;AAEZC,QAAAA,KAAAA,EAAO,OAAOC,QAAAA,GAAAA;YACZ,IAAInB,KAAAA,CAAMoB,MAAM,GAAG,CAAG,EAAA;AACpB,gBAAA,MAAMR,cAAc,MAAM,+BAAA,CAAA,IAAI,EAAEC,WAAAA,CAAAA,CAAAA,aAAW2B,IAAMxC,EAAAA,KAAAA,CAAAA;AAEjDA,gBAAAA,KAAAA,GAAQ,EAAE;AAEV,gBAAA,IAAIY,WAAa,EAAA;AACf,oBAAA,OAAOO,QAASP,CAAAA,WAAAA,CAAAA;AAClB;AACF;YACA,MAAM,EAAES,KAAK,EAAErF,KAAK,EAAE,GAAG,MAAM,+BAAA,CAAA,IAAI,EAAEuF,QAAAA,CAAAA,CAAAA,QAAQiB,CAAAA,CAAAA,IAAAA,CAAAA;YAE7C,MAAM,EAAEtG,KAAK,EAAE,GAAG,IAAI,CAACF,KAAK,CAACwG,IAAK,CAAA;YAElC,IAAIxG,KAAAA,KAAUA,KAAAA,CAAM8G,OAAO,KAAK5G,SAASF,KAAM+G,CAAAA,QAAQ,KAAK7G,KAAI,CAAI,EAAA;AAClEiF,gBAAAA,QAAAA,CACE,IAAIe,KAAAA,CACF,CAAC,mBAAmB,EAAE,IAAI,CAAClG,KAAK,CAACwG,IAAAA,CAAK,CAACtG,KAAK,CAAC,CAAC,EAAEsG,IAAAA,CAAK,WAAW,EAAExG,KAAM8G,CAAAA,OAAO,CAAC,WAAW,EAAE9G,KAAAA,CAAM+G,QAAQ,CAAC,CAAC,EAAEP,KAAK,CAAC,CAAA,CAAA;AAG3H;YAEArB,QAASE,CAAAA,KAAAA,CAAAA;AACX,SAAA;QAEAG,KAAO,EAAA,OAAOlB,OAAOoB,SAAWP,EAAAA,QAAAA,GAAAA;AAC9B,YAAA,MAAMQ,aAAa,MAAMkB,iBAAAA,EAAAA;AACzB,YAAA,IAAIlB,UAAY,EAAA;AACd,gBAAA,OAAOR,QAASQ,CAAAA,UAAAA,CAAAA;AAClB;AAEA3B,YAAAA,KAAAA,CAAMe,IAAI,CAACT,KAAAA,CAAAA;AAEX,YAAA,IAAIH,iBAAiBD,SAAW,EAAA;AAC9B,gBAAA,MAAMU,cAAc,MAAM,+BAAA,CAAA,IAAI,EAAEC,WAAAA,CAAAA,CAAAA,aAAW2B,IAAMxC,EAAAA,KAAAA,CAAAA;AAEjDA,gBAAAA,KAAAA,GAAQ,EAAE;AAEV,gBAAA,IAAIY,WAAa,EAAA;AACf,oBAAA,OAAOO,QAASP,CAAAA,WAAAA,CAAAA;AAClB;AACF;AAEAO,YAAAA,QAAAA,EAAAA;AACF;AACF,KAAA,CAAA;AACF;AAEA,SAAA,WAAYtC,OAAe,EAAA;AACzB,IAAA,+BAAA,CAAA,IAAI,EAAEzB,YAAAA,CAAAA,CAAAA,YAAAA,CAAAA,EAAa4F,MAAO,CAAA;QACxBnF,OAAS,EAAA;AACPoF,YAAAA,SAAAA,EAAW,IAAIC,IAAAA,EAAAA;AACfrE,YAAAA,OAAAA;YACAsE,MAAQ,EAAA;AACV,SAAA;QACAnE,IAAM,EAAA;AACR,KAAA,CAAA;AACF;AA2MK,MAAMoE,wCAAwC,CACnD3G,OAAAA,GAAAA;AAEA,IAAA,OAAO,IAAIX,+BAAgCW,CAAAA,OAAAA,CAAAA;AAC7C;;;;"}