@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.
- package/dist/engine/errors.js +39 -0
- package/dist/engine/errors.js.map +1 -0
- package/dist/engine/errors.mjs +34 -0
- package/dist/engine/errors.mjs.map +1 -0
- package/dist/engine/index.js +797 -0
- package/dist/engine/index.js.map +1 -0
- package/dist/engine/index.mjs +792 -0
- package/dist/engine/index.mjs.map +1 -0
- package/dist/engine/validation/provider.js +19 -0
- package/dist/engine/validation/provider.js.map +1 -0
- package/dist/engine/validation/provider.mjs +17 -0
- package/dist/engine/validation/provider.mjs.map +1 -0
- package/dist/engine/validation/schemas/index.js +57 -0
- package/dist/engine/validation/schemas/index.js.map +1 -0
- package/dist/engine/validation/schemas/index.mjs +55 -0
- package/dist/engine/validation/schemas/index.mjs.map +1 -0
- package/dist/errors/base.js +13 -0
- package/dist/errors/base.js.map +1 -0
- package/dist/errors/base.mjs +11 -0
- package/dist/errors/base.mjs.map +1 -0
- package/dist/errors/constants.js +10 -0
- package/dist/errors/constants.js.map +1 -0
- package/dist/errors/constants.mjs +8 -0
- package/dist/errors/constants.mjs.map +1 -0
- package/dist/errors/providers.js +41 -0
- package/dist/errors/providers.js.map +1 -0
- package/dist/errors/providers.mjs +36 -0
- package/dist/errors/providers.mjs.map +1 -0
- package/dist/file/index.js +8 -0
- package/dist/file/index.js.map +1 -0
- package/dist/file/index.mjs +3 -0
- package/dist/file/index.mjs.map +1 -0
- package/dist/file/providers/destination/index.js +248 -0
- package/dist/file/providers/destination/index.js.map +1 -0
- package/dist/file/providers/destination/index.mjs +246 -0
- package/dist/file/providers/destination/index.mjs.map +1 -0
- package/dist/file/providers/destination/utils.js +63 -0
- package/dist/file/providers/destination/utils.js.map +1 -0
- package/dist/file/providers/destination/utils.mjs +60 -0
- package/dist/file/providers/destination/utils.mjs.map +1 -0
- package/dist/file/providers/index.js +10 -0
- package/dist/file/providers/index.js.map +1 -0
- package/dist/file/providers/index.mjs +3 -0
- package/dist/file/providers/index.mjs.map +1 -0
- package/dist/file/providers/source/index.js +288 -0
- package/dist/file/providers/source/index.js.map +1 -0
- package/dist/file/providers/source/index.mjs +286 -0
- package/dist/file/providers/source/index.mjs.map +1 -0
- package/dist/file/providers/source/utils.js +56 -0
- package/dist/file/providers/source/utils.js.map +1 -0
- package/dist/file/providers/source/utils.mjs +52 -0
- package/dist/file/providers/source/utils.mjs.map +1 -0
- package/dist/index.js +8 -5692
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +8 -5674
- package/dist/index.mjs.map +1 -1
- package/dist/strapi/index.js +12 -0
- package/dist/strapi/index.js.map +1 -0
- package/dist/strapi/index.mjs +7 -0
- package/dist/strapi/index.mjs.map +1 -0
- package/dist/strapi/providers/index.js +16 -0
- package/dist/strapi/providers/index.js.map +1 -0
- package/dist/strapi/providers/index.mjs +7 -0
- package/dist/strapi/providers/index.mjs.map +1 -0
- package/dist/strapi/providers/local-destination/index.js +419 -0
- package/dist/strapi/providers/local-destination/index.js.map +1 -0
- package/dist/strapi/providers/local-destination/index.mjs +396 -0
- package/dist/strapi/providers/local-destination/index.mjs.map +1 -0
- package/dist/strapi/providers/local-destination/strategies/restore/configuration.js +52 -0
- package/dist/strapi/providers/local-destination/strategies/restore/configuration.js.map +1 -0
- package/dist/strapi/providers/local-destination/strategies/restore/configuration.mjs +49 -0
- package/dist/strapi/providers/local-destination/strategies/restore/configuration.mjs.map +1 -0
- package/dist/strapi/providers/local-destination/strategies/restore/entities.js +64 -0
- package/dist/strapi/providers/local-destination/strategies/restore/entities.js.map +1 -0
- package/dist/strapi/providers/local-destination/strategies/restore/entities.mjs +62 -0
- package/dist/strapi/providers/local-destination/strategies/restore/entities.mjs.map +1 -0
- package/dist/strapi/providers/local-destination/strategies/restore/index.js +126 -0
- package/dist/strapi/providers/local-destination/strategies/restore/index.js.map +1 -0
- package/dist/strapi/providers/local-destination/strategies/restore/index.mjs +122 -0
- package/dist/strapi/providers/local-destination/strategies/restore/index.mjs.map +1 -0
- package/dist/strapi/providers/local-destination/strategies/restore/links.js +60 -0
- package/dist/strapi/providers/local-destination/strategies/restore/links.js.map +1 -0
- package/dist/strapi/providers/local-destination/strategies/restore/links.mjs +58 -0
- package/dist/strapi/providers/local-destination/strategies/restore/links.mjs.map +1 -0
- package/dist/strapi/providers/local-source/assets.js +123 -0
- package/dist/strapi/providers/local-source/assets.js.map +1 -0
- package/dist/strapi/providers/local-source/assets.mjs +121 -0
- package/dist/strapi/providers/local-source/assets.mjs.map +1 -0
- package/dist/strapi/providers/local-source/configuration.js +39 -0
- package/dist/strapi/providers/local-source/configuration.js.map +1 -0
- package/dist/strapi/providers/local-source/configuration.mjs +37 -0
- package/dist/strapi/providers/local-source/configuration.mjs.map +1 -0
- package/dist/strapi/providers/local-source/entities.js +62 -0
- package/dist/strapi/providers/local-source/entities.js.map +1 -0
- package/dist/strapi/providers/local-source/entities.mjs +59 -0
- package/dist/strapi/providers/local-source/entities.mjs.map +1 -0
- package/dist/strapi/providers/local-source/index.js +154 -0
- package/dist/strapi/providers/local-source/index.js.map +1 -0
- package/dist/strapi/providers/local-source/index.mjs +152 -0
- package/dist/strapi/providers/local-source/index.mjs.map +1 -0
- package/dist/strapi/providers/local-source/links.js +26 -0
- package/dist/strapi/providers/local-source/links.js.map +1 -0
- package/dist/strapi/providers/local-source/links.mjs +24 -0
- package/dist/strapi/providers/local-source/links.mjs.map +1 -0
- package/dist/strapi/providers/remote-destination/index.js +392 -0
- package/dist/strapi/providers/remote-destination/index.js.map +1 -0
- package/dist/strapi/providers/remote-destination/index.mjs +390 -0
- package/dist/strapi/providers/remote-destination/index.mjs.map +1 -0
- package/dist/strapi/providers/remote-source/index.js +405 -0
- package/dist/strapi/providers/remote-source/index.js.map +1 -0
- package/dist/strapi/providers/remote-source/index.mjs +403 -0
- package/dist/strapi/providers/remote-source/index.mjs.map +1 -0
- package/dist/strapi/providers/utils.js +173 -0
- package/dist/strapi/providers/utils.js.map +1 -0
- package/dist/strapi/providers/utils.mjs +169 -0
- package/dist/strapi/providers/utils.mjs.map +1 -0
- package/dist/strapi/queries/entity.js +125 -0
- package/dist/strapi/queries/entity.js.map +1 -0
- package/dist/strapi/queries/entity.mjs +123 -0
- package/dist/strapi/queries/entity.mjs.map +1 -0
- package/dist/strapi/queries/index.js +10 -0
- package/dist/strapi/queries/index.js.map +1 -0
- package/dist/strapi/queries/index.mjs +5 -0
- package/dist/strapi/queries/index.mjs.map +1 -0
- package/dist/strapi/queries/link.js +298 -0
- package/dist/strapi/queries/link.js.map +1 -0
- package/dist/strapi/queries/link.mjs +295 -0
- package/dist/strapi/queries/link.mjs.map +1 -0
- package/dist/strapi/remote/constants.js +11 -0
- package/dist/strapi/remote/constants.js.map +1 -0
- package/dist/strapi/remote/constants.mjs +8 -0
- package/dist/strapi/remote/constants.mjs.map +1 -0
- package/dist/strapi/remote/flows/default.js +43 -0
- package/dist/strapi/remote/flows/default.js.map +1 -0
- package/dist/strapi/remote/flows/default.mjs +41 -0
- package/dist/strapi/remote/flows/default.mjs.map +1 -0
- package/dist/strapi/remote/flows/index.js +54 -0
- package/dist/strapi/remote/flows/index.js.map +1 -0
- package/dist/strapi/remote/flows/index.mjs +52 -0
- package/dist/strapi/remote/flows/index.mjs.map +1 -0
- package/dist/strapi/remote/handlers/constants.js +10 -0
- package/dist/strapi/remote/handlers/constants.js.map +1 -0
- package/dist/strapi/remote/handlers/constants.mjs +8 -0
- package/dist/strapi/remote/handlers/constants.mjs.map +1 -0
- package/dist/strapi/remote/handlers/index.js +12 -0
- package/dist/strapi/remote/handlers/index.js.map +1 -0
- package/dist/strapi/remote/handlers/index.mjs +4 -0
- package/dist/strapi/remote/handlers/index.mjs.map +1 -0
- package/dist/strapi/remote/handlers/pull.js +348 -0
- package/dist/strapi/remote/handlers/pull.js.map +1 -0
- package/dist/strapi/remote/handlers/pull.mjs +346 -0
- package/dist/strapi/remote/handlers/pull.mjs.map +1 -0
- package/dist/strapi/remote/handlers/push.js +400 -0
- package/dist/strapi/remote/handlers/push.js.map +1 -0
- package/dist/strapi/remote/handlers/push.mjs +398 -0
- package/dist/strapi/remote/handlers/push.mjs.map +1 -0
- package/dist/strapi/remote/handlers/utils.js +316 -0
- package/dist/strapi/remote/handlers/utils.js.map +1 -0
- package/dist/strapi/remote/handlers/utils.mjs +310 -0
- package/dist/strapi/remote/handlers/utils.mjs.map +1 -0
- package/dist/strapi/remote/index.js +10 -0
- package/dist/strapi/remote/index.js.map +1 -0
- package/dist/strapi/remote/index.mjs +5 -0
- package/dist/strapi/remote/index.mjs.map +1 -0
- package/dist/utils/components.js +178 -0
- package/dist/utils/components.js.map +1 -0
- package/dist/utils/components.mjs +171 -0
- package/dist/utils/components.mjs.map +1 -0
- package/dist/utils/diagnostic.js +51 -0
- package/dist/utils/diagnostic.js.map +1 -0
- package/dist/utils/diagnostic.mjs +49 -0
- package/dist/utils/diagnostic.mjs.map +1 -0
- package/dist/utils/encryption/decrypt.js +47 -0
- package/dist/utils/encryption/decrypt.js.map +1 -0
- package/dist/utils/encryption/decrypt.mjs +45 -0
- package/dist/utils/encryption/decrypt.mjs.map +1 -0
- package/dist/utils/encryption/encrypt.js +47 -0
- package/dist/utils/encryption/encrypt.js.map +1 -0
- package/dist/utils/encryption/encrypt.mjs +45 -0
- package/dist/utils/encryption/encrypt.mjs.map +1 -0
- package/dist/utils/encryption/index.js +10 -0
- package/dist/utils/encryption/index.js.map +1 -0
- package/dist/utils/encryption/index.mjs +3 -0
- package/dist/utils/encryption/index.mjs.map +1 -0
- package/dist/utils/index.js +20 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/index.mjs +15 -0
- package/dist/utils/index.mjs.map +1 -0
- package/dist/utils/json.js +96 -0
- package/dist/utils/json.js.map +1 -0
- package/dist/utils/json.mjs +94 -0
- package/dist/utils/json.mjs.map +1 -0
- package/dist/utils/middleware.js +14 -0
- package/dist/utils/middleware.js.map +1 -0
- package/dist/utils/middleware.mjs +12 -0
- package/dist/utils/middleware.mjs.map +1 -0
- package/dist/utils/providers.js +12 -0
- package/dist/utils/providers.js.map +1 -0
- package/dist/utils/providers.mjs +10 -0
- package/dist/utils/providers.mjs.map +1 -0
- package/dist/utils/schema.js +32 -0
- package/dist/utils/schema.js.map +1 -0
- package/dist/utils/schema.mjs +29 -0
- package/dist/utils/schema.mjs.map +1 -0
- package/dist/utils/stream.js +59 -0
- package/dist/utils/stream.js.map +1 -0
- package/dist/utils/stream.mjs +55 -0
- package/dist/utils/stream.mjs.map +1 -0
- package/dist/utils/transaction.js +93 -0
- package/dist/utils/transaction.js.map +1 -0
- package/dist/utils/transaction.mjs +91 -0
- package/dist/utils/transaction.mjs.map +1 -0
- package/package.json +5 -5
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var path = require('path');
|
|
4
|
+
var zip = require('zlib');
|
|
5
|
+
var stream = require('stream');
|
|
6
|
+
var fse = require('fs-extra');
|
|
7
|
+
var tar = require('tar-stream');
|
|
8
|
+
var Stringer = require('stream-json/jsonl/Stringer');
|
|
9
|
+
var streamChain = require('stream-chain');
|
|
10
|
+
var encrypt = require('../../../utils/encryption/encrypt.js');
|
|
11
|
+
require('crypto');
|
|
12
|
+
var utils = require('./utils.js');
|
|
13
|
+
var providers = require('../../../errors/providers.js');
|
|
14
|
+
|
|
15
|
+
function _class_private_field_loose_base(receiver, privateKey) {
|
|
16
|
+
if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) {
|
|
17
|
+
throw new TypeError("attempted to use private field on non-instance");
|
|
18
|
+
}
|
|
19
|
+
return receiver;
|
|
20
|
+
}
|
|
21
|
+
var id = 0;
|
|
22
|
+
function _class_private_field_loose_key(name) {
|
|
23
|
+
return "__private_" + id++ + "_" + name;
|
|
24
|
+
}
|
|
25
|
+
const createLocalFileDestinationProvider = (options)=>{
|
|
26
|
+
return new LocalFileDestinationProvider(options);
|
|
27
|
+
};
|
|
28
|
+
var _providersMetadata = /*#__PURE__*/ _class_private_field_loose_key("_providersMetadata"), _archive = /*#__PURE__*/ _class_private_field_loose_key("_archive"), _diagnostics = /*#__PURE__*/ _class_private_field_loose_key("_diagnostics"), _reportInfo = /*#__PURE__*/ _class_private_field_loose_key("_reportInfo"), _archivePath = /*#__PURE__*/ _class_private_field_loose_key("_archivePath"), _writeMetadata = /*#__PURE__*/ _class_private_field_loose_key("_writeMetadata"), _getMetadataStream = /*#__PURE__*/ _class_private_field_loose_key("_getMetadataStream");
|
|
29
|
+
class LocalFileDestinationProvider {
|
|
30
|
+
setMetadata(target, metadata) {
|
|
31
|
+
_class_private_field_loose_base(this, _providersMetadata)[_providersMetadata][target] = metadata;
|
|
32
|
+
return this;
|
|
33
|
+
}
|
|
34
|
+
createGzip() {
|
|
35
|
+
_class_private_field_loose_base(this, _reportInfo)[_reportInfo]('creating gzip');
|
|
36
|
+
return zip.createGzip();
|
|
37
|
+
}
|
|
38
|
+
bootstrap(diagnostics) {
|
|
39
|
+
_class_private_field_loose_base(this, _diagnostics)[_diagnostics] = diagnostics;
|
|
40
|
+
const { compression, encryption } = this.options;
|
|
41
|
+
if (encryption.enabled && !encryption.key) {
|
|
42
|
+
throw new Error("Can't encrypt without a key");
|
|
43
|
+
}
|
|
44
|
+
_class_private_field_loose_base(this, _archive)[_archive].stream = tar.pack();
|
|
45
|
+
const outStream = fse.createWriteStream(_class_private_field_loose_base(this, _archivePath)[_archivePath]);
|
|
46
|
+
outStream.on('error', (err)=>{
|
|
47
|
+
if (err.code === 'ENOSPC') {
|
|
48
|
+
throw new providers.ProviderTransferError("Your server doesn't have space to proceed with the import.");
|
|
49
|
+
}
|
|
50
|
+
throw err;
|
|
51
|
+
});
|
|
52
|
+
const archiveTransforms = [];
|
|
53
|
+
if (compression.enabled) {
|
|
54
|
+
archiveTransforms.push(this.createGzip());
|
|
55
|
+
}
|
|
56
|
+
if (encryption.enabled && encryption.key) {
|
|
57
|
+
archiveTransforms.push(encrypt.createEncryptionCipher(encryption.key));
|
|
58
|
+
}
|
|
59
|
+
_class_private_field_loose_base(this, _archive)[_archive].pipeline = streamChain.chain([
|
|
60
|
+
_class_private_field_loose_base(this, _archive)[_archive].stream,
|
|
61
|
+
...archiveTransforms,
|
|
62
|
+
outStream
|
|
63
|
+
]);
|
|
64
|
+
this.results.file = {
|
|
65
|
+
path: _class_private_field_loose_base(this, _archivePath)[_archivePath]
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
async close() {
|
|
69
|
+
const { stream, pipeline } = _class_private_field_loose_base(this, _archive)[_archive];
|
|
70
|
+
if (!stream) {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
await _class_private_field_loose_base(this, _writeMetadata)[_writeMetadata]();
|
|
74
|
+
stream.finalize();
|
|
75
|
+
if (pipeline && !pipeline.closed) {
|
|
76
|
+
await new Promise((resolve, reject)=>{
|
|
77
|
+
pipeline.on('close', resolve).on('error', reject);
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
async rollback() {
|
|
82
|
+
_class_private_field_loose_base(this, _reportInfo)[_reportInfo]('rolling back');
|
|
83
|
+
await this.close();
|
|
84
|
+
await fse.rm(_class_private_field_loose_base(this, _archivePath)[_archivePath], {
|
|
85
|
+
force: true
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
getMetadata() {
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
createSchemasWriteStream() {
|
|
92
|
+
if (!_class_private_field_loose_base(this, _archive)[_archive].stream) {
|
|
93
|
+
throw new Error('Archive stream is unavailable');
|
|
94
|
+
}
|
|
95
|
+
_class_private_field_loose_base(this, _reportInfo)[_reportInfo]('creating schemas write stream');
|
|
96
|
+
const filePathFactory = utils.createFilePathFactory('schemas');
|
|
97
|
+
const entryStream = utils.createTarEntryStream(_class_private_field_loose_base(this, _archive)[_archive].stream, filePathFactory, this.options.file.maxSizeJsonl);
|
|
98
|
+
return streamChain.chain([
|
|
99
|
+
Stringer.stringer(),
|
|
100
|
+
entryStream
|
|
101
|
+
]);
|
|
102
|
+
}
|
|
103
|
+
createEntitiesWriteStream() {
|
|
104
|
+
if (!_class_private_field_loose_base(this, _archive)[_archive].stream) {
|
|
105
|
+
throw new Error('Archive stream is unavailable');
|
|
106
|
+
}
|
|
107
|
+
_class_private_field_loose_base(this, _reportInfo)[_reportInfo]('creating entities write stream');
|
|
108
|
+
const filePathFactory = utils.createFilePathFactory('entities');
|
|
109
|
+
const entryStream = utils.createTarEntryStream(_class_private_field_loose_base(this, _archive)[_archive].stream, filePathFactory, this.options.file.maxSizeJsonl);
|
|
110
|
+
return streamChain.chain([
|
|
111
|
+
Stringer.stringer(),
|
|
112
|
+
entryStream
|
|
113
|
+
]);
|
|
114
|
+
}
|
|
115
|
+
createLinksWriteStream() {
|
|
116
|
+
if (!_class_private_field_loose_base(this, _archive)[_archive].stream) {
|
|
117
|
+
throw new Error('Archive stream is unavailable');
|
|
118
|
+
}
|
|
119
|
+
_class_private_field_loose_base(this, _reportInfo)[_reportInfo]('creating links write stream');
|
|
120
|
+
const filePathFactory = utils.createFilePathFactory('links');
|
|
121
|
+
const entryStream = utils.createTarEntryStream(_class_private_field_loose_base(this, _archive)[_archive].stream, filePathFactory, this.options.file.maxSizeJsonl);
|
|
122
|
+
return streamChain.chain([
|
|
123
|
+
Stringer.stringer(),
|
|
124
|
+
entryStream
|
|
125
|
+
]);
|
|
126
|
+
}
|
|
127
|
+
createConfigurationWriteStream() {
|
|
128
|
+
if (!_class_private_field_loose_base(this, _archive)[_archive].stream) {
|
|
129
|
+
throw new Error('Archive stream is unavailable');
|
|
130
|
+
}
|
|
131
|
+
_class_private_field_loose_base(this, _reportInfo)[_reportInfo]('creating configuration write stream');
|
|
132
|
+
const filePathFactory = utils.createFilePathFactory('configuration');
|
|
133
|
+
const entryStream = utils.createTarEntryStream(_class_private_field_loose_base(this, _archive)[_archive].stream, filePathFactory, this.options.file.maxSizeJsonl);
|
|
134
|
+
return streamChain.chain([
|
|
135
|
+
Stringer.stringer(),
|
|
136
|
+
entryStream
|
|
137
|
+
]);
|
|
138
|
+
}
|
|
139
|
+
createAssetsWriteStream() {
|
|
140
|
+
const { stream: archiveStream } = _class_private_field_loose_base(this, _archive)[_archive];
|
|
141
|
+
if (!archiveStream) {
|
|
142
|
+
throw new Error('Archive stream is unavailable');
|
|
143
|
+
}
|
|
144
|
+
_class_private_field_loose_base(this, _reportInfo)[_reportInfo]('creating assets write stream');
|
|
145
|
+
return new stream.Writable({
|
|
146
|
+
objectMode: true,
|
|
147
|
+
write (data, _encoding, callback) {
|
|
148
|
+
// always write tar files with posix paths so we have a standard format for paths regardless of system
|
|
149
|
+
const entryPath = path.posix.join('assets', 'uploads', data.filename);
|
|
150
|
+
const entryMetadataPath = path.posix.join('assets', 'metadata', `${data.filename}.json`);
|
|
151
|
+
const stringifiedMetadata = JSON.stringify(data.metadata);
|
|
152
|
+
archiveStream.entry({
|
|
153
|
+
name: entryMetadataPath,
|
|
154
|
+
size: stringifiedMetadata.length
|
|
155
|
+
}, stringifiedMetadata);
|
|
156
|
+
const entry = archiveStream.entry({
|
|
157
|
+
name: entryPath,
|
|
158
|
+
size: data.stats.size
|
|
159
|
+
});
|
|
160
|
+
if (!entry) {
|
|
161
|
+
callback(new Error(`Failed to created an asset tar entry for ${entryPath}`));
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
data.stream.pipe(entry);
|
|
165
|
+
entry.on('finish', ()=>{
|
|
166
|
+
callback(null);
|
|
167
|
+
}).on('error', (error)=>{
|
|
168
|
+
callback(error);
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
constructor(options){
|
|
174
|
+
Object.defineProperty(this, _reportInfo, {
|
|
175
|
+
value: reportInfo
|
|
176
|
+
});
|
|
177
|
+
Object.defineProperty(this, _archivePath, {
|
|
178
|
+
get: get_archivePath,
|
|
179
|
+
set: void 0
|
|
180
|
+
});
|
|
181
|
+
Object.defineProperty(this, _writeMetadata, {
|
|
182
|
+
value: writeMetadata
|
|
183
|
+
});
|
|
184
|
+
Object.defineProperty(this, _getMetadataStream, {
|
|
185
|
+
value: getMetadataStream
|
|
186
|
+
});
|
|
187
|
+
Object.defineProperty(this, _providersMetadata, {
|
|
188
|
+
writable: true,
|
|
189
|
+
value: void 0
|
|
190
|
+
});
|
|
191
|
+
Object.defineProperty(this, _archive, {
|
|
192
|
+
writable: true,
|
|
193
|
+
value: void 0
|
|
194
|
+
});
|
|
195
|
+
Object.defineProperty(this, _diagnostics, {
|
|
196
|
+
writable: true,
|
|
197
|
+
value: void 0
|
|
198
|
+
});
|
|
199
|
+
this.name = 'destination::local-file';
|
|
200
|
+
this.type = 'destination';
|
|
201
|
+
this.results = {};
|
|
202
|
+
_class_private_field_loose_base(this, _providersMetadata)[_providersMetadata] = {};
|
|
203
|
+
_class_private_field_loose_base(this, _archive)[_archive] = {};
|
|
204
|
+
this.options = options;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
function reportInfo(message) {
|
|
208
|
+
_class_private_field_loose_base(this, _diagnostics)[_diagnostics]?.report({
|
|
209
|
+
details: {
|
|
210
|
+
createdAt: new Date(),
|
|
211
|
+
message,
|
|
212
|
+
origin: 'file-destination-provider'
|
|
213
|
+
},
|
|
214
|
+
kind: 'info'
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
function get_archivePath() {
|
|
218
|
+
const { encryption, compression, file } = this.options;
|
|
219
|
+
let filePath = `${file.path}.tar`;
|
|
220
|
+
if (compression.enabled) {
|
|
221
|
+
filePath += '.gz';
|
|
222
|
+
}
|
|
223
|
+
if (encryption.enabled) {
|
|
224
|
+
filePath += '.enc';
|
|
225
|
+
}
|
|
226
|
+
return filePath;
|
|
227
|
+
}
|
|
228
|
+
async function writeMetadata() {
|
|
229
|
+
_class_private_field_loose_base(this, _reportInfo)[_reportInfo]('writing metadata');
|
|
230
|
+
const metadata = _class_private_field_loose_base(this, _providersMetadata)[_providersMetadata].source;
|
|
231
|
+
if (metadata) {
|
|
232
|
+
await new Promise((resolve)=>{
|
|
233
|
+
const outStream = _class_private_field_loose_base(this, _getMetadataStream)[_getMetadataStream]();
|
|
234
|
+
const data = JSON.stringify(metadata, null, 2);
|
|
235
|
+
stream.Readable.from(data).pipe(outStream).on('close', resolve);
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
function getMetadataStream() {
|
|
240
|
+
const { stream } = _class_private_field_loose_base(this, _archive)[_archive];
|
|
241
|
+
if (!stream) {
|
|
242
|
+
throw new Error('Archive stream is unavailable');
|
|
243
|
+
}
|
|
244
|
+
return utils.createTarEntryStream(stream, ()=>'metadata.json');
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
exports.createLocalFileDestinationProvider = createLocalFileDestinationProvider;
|
|
248
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/file/providers/destination/index.ts"],"sourcesContent":["import path from 'path';\nimport zlib from 'zlib';\nimport { Readable, Writable } from 'stream';\nimport { rm, createWriteStream } from 'fs-extra';\nimport tar from 'tar-stream';\nimport { stringer } from 'stream-json/jsonl/Stringer';\nimport { chain } from 'stream-chain';\n\nimport { createEncryptionCipher } from '../../../utils/encryption';\nimport type {\n IAsset,\n IDestinationProvider,\n IDestinationProviderTransferResults,\n IMetadata,\n ProviderType,\n Stream,\n} from '../../../../types';\nimport type { IDiagnosticReporter } from '../../../utils/diagnostic';\nimport { createFilePathFactory, createTarEntryStream } from './utils';\nimport { ProviderTransferError } from '../../../errors/providers';\n\nexport interface ILocalFileDestinationProviderOptions {\n encryption: {\n enabled: boolean; // if the file should be encrypted\n key?: string; // the key to use when encryption.enabled is true\n };\n\n compression: {\n enabled: boolean; // if the file should be compressed with gzip\n };\n\n file: {\n path: string; // the filename to create\n maxSize?: number; // the max size of a single backup file\n maxSizeJsonl?: number; // the max lines of each jsonl file before creating the next file\n };\n}\n\nexport interface ILocalFileDestinationProviderTransferResults\n extends IDestinationProviderTransferResults {\n file?: {\n path?: string;\n };\n}\n\nexport const createLocalFileDestinationProvider = (\n options: ILocalFileDestinationProviderOptions\n) => {\n return new LocalFileDestinationProvider(options);\n};\n\nclass LocalFileDestinationProvider implements IDestinationProvider {\n name = 'destination::local-file';\n\n type: ProviderType = 'destination';\n\n options: ILocalFileDestinationProviderOptions;\n\n results: ILocalFileDestinationProviderTransferResults = {};\n\n #providersMetadata: { source?: IMetadata; destination?: IMetadata } = {};\n\n #archive: { stream?: tar.Pack; pipeline?: Stream } = {};\n\n #diagnostics?: IDiagnosticReporter;\n\n constructor(options: ILocalFileDestinationProviderOptions) {\n this.options = options;\n }\n\n #reportInfo(message: string) {\n this.#diagnostics?.report({\n details: {\n createdAt: new Date(),\n message,\n origin: 'file-destination-provider',\n },\n kind: 'info',\n });\n }\n\n get #archivePath() {\n const { encryption, compression, file } = this.options;\n\n let filePath = `${file.path}.tar`;\n\n if (compression.enabled) {\n filePath += '.gz';\n }\n\n if (encryption.enabled) {\n filePath += '.enc';\n }\n\n return filePath;\n }\n\n setMetadata(target: ProviderType, metadata: IMetadata): IDestinationProvider {\n this.#providersMetadata[target] = metadata;\n\n return this;\n }\n\n createGzip(): zlib.Gzip {\n this.#reportInfo('creating gzip');\n return zlib.createGzip();\n }\n\n bootstrap(diagnostics: IDiagnosticReporter): void | Promise<void> {\n this.#diagnostics = diagnostics;\n const { compression, encryption } = this.options;\n\n if (encryption.enabled && !encryption.key) {\n throw new Error(\"Can't encrypt without a key\");\n }\n\n this.#archive.stream = tar.pack();\n\n const outStream = createWriteStream(this.#archivePath);\n\n outStream.on('error', (err: NodeJS.ErrnoException) => {\n if (err.code === 'ENOSPC') {\n throw new ProviderTransferError(\n \"Your server doesn't have space to proceed with the import.\"\n );\n }\n throw err;\n });\n\n const archiveTransforms: Stream[] = [];\n\n if (compression.enabled) {\n archiveTransforms.push(this.createGzip());\n }\n\n if (encryption.enabled && encryption.key) {\n archiveTransforms.push(createEncryptionCipher(encryption.key));\n }\n\n this.#archive.pipeline = chain([this.#archive.stream, ...archiveTransforms, outStream]);\n\n this.results.file = { path: this.#archivePath };\n }\n\n async close() {\n const { stream, pipeline } = this.#archive;\n\n if (!stream) {\n return;\n }\n\n await this.#writeMetadata();\n stream.finalize();\n\n if (pipeline && !pipeline.closed) {\n await new Promise<void>((resolve, reject) => {\n pipeline.on('close', resolve).on('error', reject);\n });\n }\n }\n\n async rollback(): Promise<void> {\n this.#reportInfo('rolling back');\n await this.close();\n await rm(this.#archivePath, { force: true });\n }\n\n getMetadata() {\n return null;\n }\n\n async #writeMetadata(): Promise<void> {\n this.#reportInfo('writing metadata');\n const metadata = this.#providersMetadata.source;\n\n if (metadata) {\n await new Promise((resolve) => {\n const outStream = this.#getMetadataStream();\n const data = JSON.stringify(metadata, null, 2);\n\n Readable.from(data).pipe(outStream).on('close', resolve);\n });\n }\n }\n\n #getMetadataStream() {\n const { stream } = this.#archive;\n\n if (!stream) {\n throw new Error('Archive stream is unavailable');\n }\n\n return createTarEntryStream(stream, () => 'metadata.json');\n }\n\n createSchemasWriteStream() {\n if (!this.#archive.stream) {\n throw new Error('Archive stream is unavailable');\n }\n this.#reportInfo('creating schemas write stream');\n const filePathFactory = createFilePathFactory('schemas');\n\n const entryStream = createTarEntryStream(\n this.#archive.stream,\n filePathFactory,\n this.options.file.maxSizeJsonl\n );\n\n return chain([stringer(), entryStream]);\n }\n\n createEntitiesWriteStream(): Writable {\n if (!this.#archive.stream) {\n throw new Error('Archive stream is unavailable');\n }\n this.#reportInfo('creating entities write stream');\n const filePathFactory = createFilePathFactory('entities');\n\n const entryStream = createTarEntryStream(\n this.#archive.stream,\n filePathFactory,\n this.options.file.maxSizeJsonl\n );\n\n return chain([stringer(), entryStream]);\n }\n\n createLinksWriteStream(): Writable {\n if (!this.#archive.stream) {\n throw new Error('Archive stream is unavailable');\n }\n this.#reportInfo('creating links write stream');\n const filePathFactory = createFilePathFactory('links');\n\n const entryStream = createTarEntryStream(\n this.#archive.stream,\n filePathFactory,\n this.options.file.maxSizeJsonl\n );\n\n return chain([stringer(), entryStream]);\n }\n\n createConfigurationWriteStream(): Writable {\n if (!this.#archive.stream) {\n throw new Error('Archive stream is unavailable');\n }\n this.#reportInfo('creating configuration write stream');\n const filePathFactory = createFilePathFactory('configuration');\n\n const entryStream = createTarEntryStream(\n this.#archive.stream,\n filePathFactory,\n this.options.file.maxSizeJsonl\n );\n\n return chain([stringer(), entryStream]);\n }\n\n createAssetsWriteStream(): Writable {\n const { stream: archiveStream } = this.#archive;\n\n if (!archiveStream) {\n throw new Error('Archive stream is unavailable');\n }\n\n this.#reportInfo('creating assets write stream');\n return new Writable({\n objectMode: true,\n write(data: IAsset, _encoding, callback) {\n // always write tar files with posix paths so we have a standard format for paths regardless of system\n const entryPath = path.posix.join('assets', 'uploads', data.filename);\n\n const entryMetadataPath = path.posix.join('assets', 'metadata', `${data.filename}.json`);\n const stringifiedMetadata = JSON.stringify(data.metadata);\n archiveStream.entry(\n {\n name: entryMetadataPath,\n size: stringifiedMetadata.length,\n },\n stringifiedMetadata\n );\n\n const entry = archiveStream.entry({\n name: entryPath,\n size: data.stats.size,\n });\n\n if (!entry) {\n callback(new Error(`Failed to created an asset tar entry for ${entryPath}`));\n return;\n }\n\n data.stream.pipe(entry);\n\n entry\n .on('finish', () => {\n callback(null);\n })\n .on('error', (error) => {\n callback(error);\n });\n },\n });\n }\n}\n"],"names":["createLocalFileDestinationProvider","options","LocalFileDestinationProvider","setMetadata","target","metadata","providersMetadata","createGzip","reportInfo","zlib","bootstrap","diagnostics","compression","encryption","enabled","key","Error","archive","stream","tar","pack","outStream","createWriteStream","archivePath","on","err","code","ProviderTransferError","archiveTransforms","push","createEncryptionCipher","pipeline","chain","results","file","path","close","writeMetadata","finalize","closed","Promise","resolve","reject","rollback","rm","force","getMetadata","createSchemasWriteStream","filePathFactory","createFilePathFactory","entryStream","createTarEntryStream","maxSizeJsonl","stringer","createEntitiesWriteStream","createLinksWriteStream","createConfigurationWriteStream","createAssetsWriteStream","archiveStream","Writable","objectMode","write","data","_encoding","callback","entryPath","posix","join","filename","entryMetadataPath","stringifiedMetadata","JSON","stringify","entry","name","size","length","stats","pipe","error","constructor","type","message","report","details","createdAt","Date","origin","kind","filePath","source","getMetadataStream","Readable","from"],"mappings":"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"}
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
import path from 'path';
|
|
2
|
+
import zip from 'zlib';
|
|
3
|
+
import { Writable, Readable } from 'stream';
|
|
4
|
+
import { createWriteStream, rm } from 'fs-extra';
|
|
5
|
+
import tar from 'tar-stream';
|
|
6
|
+
import { stringer } from 'stream-json/jsonl/Stringer';
|
|
7
|
+
import { chain } from 'stream-chain';
|
|
8
|
+
import { createEncryptionCipher } from '../../../utils/encryption/encrypt.mjs';
|
|
9
|
+
import 'crypto';
|
|
10
|
+
import { createTarEntryStream, createFilePathFactory } from './utils.mjs';
|
|
11
|
+
import { ProviderTransferError } from '../../../errors/providers.mjs';
|
|
12
|
+
|
|
13
|
+
function _class_private_field_loose_base(receiver, privateKey) {
|
|
14
|
+
if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) {
|
|
15
|
+
throw new TypeError("attempted to use private field on non-instance");
|
|
16
|
+
}
|
|
17
|
+
return receiver;
|
|
18
|
+
}
|
|
19
|
+
var id = 0;
|
|
20
|
+
function _class_private_field_loose_key(name) {
|
|
21
|
+
return "__private_" + id++ + "_" + name;
|
|
22
|
+
}
|
|
23
|
+
const createLocalFileDestinationProvider = (options)=>{
|
|
24
|
+
return new LocalFileDestinationProvider(options);
|
|
25
|
+
};
|
|
26
|
+
var _providersMetadata = /*#__PURE__*/ _class_private_field_loose_key("_providersMetadata"), _archive = /*#__PURE__*/ _class_private_field_loose_key("_archive"), _diagnostics = /*#__PURE__*/ _class_private_field_loose_key("_diagnostics"), _reportInfo = /*#__PURE__*/ _class_private_field_loose_key("_reportInfo"), _archivePath = /*#__PURE__*/ _class_private_field_loose_key("_archivePath"), _writeMetadata = /*#__PURE__*/ _class_private_field_loose_key("_writeMetadata"), _getMetadataStream = /*#__PURE__*/ _class_private_field_loose_key("_getMetadataStream");
|
|
27
|
+
class LocalFileDestinationProvider {
|
|
28
|
+
setMetadata(target, metadata) {
|
|
29
|
+
_class_private_field_loose_base(this, _providersMetadata)[_providersMetadata][target] = metadata;
|
|
30
|
+
return this;
|
|
31
|
+
}
|
|
32
|
+
createGzip() {
|
|
33
|
+
_class_private_field_loose_base(this, _reportInfo)[_reportInfo]('creating gzip');
|
|
34
|
+
return zip.createGzip();
|
|
35
|
+
}
|
|
36
|
+
bootstrap(diagnostics) {
|
|
37
|
+
_class_private_field_loose_base(this, _diagnostics)[_diagnostics] = diagnostics;
|
|
38
|
+
const { compression, encryption } = this.options;
|
|
39
|
+
if (encryption.enabled && !encryption.key) {
|
|
40
|
+
throw new Error("Can't encrypt without a key");
|
|
41
|
+
}
|
|
42
|
+
_class_private_field_loose_base(this, _archive)[_archive].stream = tar.pack();
|
|
43
|
+
const outStream = createWriteStream(_class_private_field_loose_base(this, _archivePath)[_archivePath]);
|
|
44
|
+
outStream.on('error', (err)=>{
|
|
45
|
+
if (err.code === 'ENOSPC') {
|
|
46
|
+
throw new ProviderTransferError("Your server doesn't have space to proceed with the import.");
|
|
47
|
+
}
|
|
48
|
+
throw err;
|
|
49
|
+
});
|
|
50
|
+
const archiveTransforms = [];
|
|
51
|
+
if (compression.enabled) {
|
|
52
|
+
archiveTransforms.push(this.createGzip());
|
|
53
|
+
}
|
|
54
|
+
if (encryption.enabled && encryption.key) {
|
|
55
|
+
archiveTransforms.push(createEncryptionCipher(encryption.key));
|
|
56
|
+
}
|
|
57
|
+
_class_private_field_loose_base(this, _archive)[_archive].pipeline = chain([
|
|
58
|
+
_class_private_field_loose_base(this, _archive)[_archive].stream,
|
|
59
|
+
...archiveTransforms,
|
|
60
|
+
outStream
|
|
61
|
+
]);
|
|
62
|
+
this.results.file = {
|
|
63
|
+
path: _class_private_field_loose_base(this, _archivePath)[_archivePath]
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
async close() {
|
|
67
|
+
const { stream, pipeline } = _class_private_field_loose_base(this, _archive)[_archive];
|
|
68
|
+
if (!stream) {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
await _class_private_field_loose_base(this, _writeMetadata)[_writeMetadata]();
|
|
72
|
+
stream.finalize();
|
|
73
|
+
if (pipeline && !pipeline.closed) {
|
|
74
|
+
await new Promise((resolve, reject)=>{
|
|
75
|
+
pipeline.on('close', resolve).on('error', reject);
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
async rollback() {
|
|
80
|
+
_class_private_field_loose_base(this, _reportInfo)[_reportInfo]('rolling back');
|
|
81
|
+
await this.close();
|
|
82
|
+
await rm(_class_private_field_loose_base(this, _archivePath)[_archivePath], {
|
|
83
|
+
force: true
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
getMetadata() {
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
createSchemasWriteStream() {
|
|
90
|
+
if (!_class_private_field_loose_base(this, _archive)[_archive].stream) {
|
|
91
|
+
throw new Error('Archive stream is unavailable');
|
|
92
|
+
}
|
|
93
|
+
_class_private_field_loose_base(this, _reportInfo)[_reportInfo]('creating schemas write stream');
|
|
94
|
+
const filePathFactory = createFilePathFactory('schemas');
|
|
95
|
+
const entryStream = createTarEntryStream(_class_private_field_loose_base(this, _archive)[_archive].stream, filePathFactory, this.options.file.maxSizeJsonl);
|
|
96
|
+
return chain([
|
|
97
|
+
stringer(),
|
|
98
|
+
entryStream
|
|
99
|
+
]);
|
|
100
|
+
}
|
|
101
|
+
createEntitiesWriteStream() {
|
|
102
|
+
if (!_class_private_field_loose_base(this, _archive)[_archive].stream) {
|
|
103
|
+
throw new Error('Archive stream is unavailable');
|
|
104
|
+
}
|
|
105
|
+
_class_private_field_loose_base(this, _reportInfo)[_reportInfo]('creating entities write stream');
|
|
106
|
+
const filePathFactory = createFilePathFactory('entities');
|
|
107
|
+
const entryStream = createTarEntryStream(_class_private_field_loose_base(this, _archive)[_archive].stream, filePathFactory, this.options.file.maxSizeJsonl);
|
|
108
|
+
return chain([
|
|
109
|
+
stringer(),
|
|
110
|
+
entryStream
|
|
111
|
+
]);
|
|
112
|
+
}
|
|
113
|
+
createLinksWriteStream() {
|
|
114
|
+
if (!_class_private_field_loose_base(this, _archive)[_archive].stream) {
|
|
115
|
+
throw new Error('Archive stream is unavailable');
|
|
116
|
+
}
|
|
117
|
+
_class_private_field_loose_base(this, _reportInfo)[_reportInfo]('creating links write stream');
|
|
118
|
+
const filePathFactory = createFilePathFactory('links');
|
|
119
|
+
const entryStream = createTarEntryStream(_class_private_field_loose_base(this, _archive)[_archive].stream, filePathFactory, this.options.file.maxSizeJsonl);
|
|
120
|
+
return chain([
|
|
121
|
+
stringer(),
|
|
122
|
+
entryStream
|
|
123
|
+
]);
|
|
124
|
+
}
|
|
125
|
+
createConfigurationWriteStream() {
|
|
126
|
+
if (!_class_private_field_loose_base(this, _archive)[_archive].stream) {
|
|
127
|
+
throw new Error('Archive stream is unavailable');
|
|
128
|
+
}
|
|
129
|
+
_class_private_field_loose_base(this, _reportInfo)[_reportInfo]('creating configuration write stream');
|
|
130
|
+
const filePathFactory = createFilePathFactory('configuration');
|
|
131
|
+
const entryStream = createTarEntryStream(_class_private_field_loose_base(this, _archive)[_archive].stream, filePathFactory, this.options.file.maxSizeJsonl);
|
|
132
|
+
return chain([
|
|
133
|
+
stringer(),
|
|
134
|
+
entryStream
|
|
135
|
+
]);
|
|
136
|
+
}
|
|
137
|
+
createAssetsWriteStream() {
|
|
138
|
+
const { stream: archiveStream } = _class_private_field_loose_base(this, _archive)[_archive];
|
|
139
|
+
if (!archiveStream) {
|
|
140
|
+
throw new Error('Archive stream is unavailable');
|
|
141
|
+
}
|
|
142
|
+
_class_private_field_loose_base(this, _reportInfo)[_reportInfo]('creating assets write stream');
|
|
143
|
+
return new Writable({
|
|
144
|
+
objectMode: true,
|
|
145
|
+
write (data, _encoding, callback) {
|
|
146
|
+
// always write tar files with posix paths so we have a standard format for paths regardless of system
|
|
147
|
+
const entryPath = path.posix.join('assets', 'uploads', data.filename);
|
|
148
|
+
const entryMetadataPath = path.posix.join('assets', 'metadata', `${data.filename}.json`);
|
|
149
|
+
const stringifiedMetadata = JSON.stringify(data.metadata);
|
|
150
|
+
archiveStream.entry({
|
|
151
|
+
name: entryMetadataPath,
|
|
152
|
+
size: stringifiedMetadata.length
|
|
153
|
+
}, stringifiedMetadata);
|
|
154
|
+
const entry = archiveStream.entry({
|
|
155
|
+
name: entryPath,
|
|
156
|
+
size: data.stats.size
|
|
157
|
+
});
|
|
158
|
+
if (!entry) {
|
|
159
|
+
callback(new Error(`Failed to created an asset tar entry for ${entryPath}`));
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
data.stream.pipe(entry);
|
|
163
|
+
entry.on('finish', ()=>{
|
|
164
|
+
callback(null);
|
|
165
|
+
}).on('error', (error)=>{
|
|
166
|
+
callback(error);
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
constructor(options){
|
|
172
|
+
Object.defineProperty(this, _reportInfo, {
|
|
173
|
+
value: reportInfo
|
|
174
|
+
});
|
|
175
|
+
Object.defineProperty(this, _archivePath, {
|
|
176
|
+
get: get_archivePath,
|
|
177
|
+
set: void 0
|
|
178
|
+
});
|
|
179
|
+
Object.defineProperty(this, _writeMetadata, {
|
|
180
|
+
value: writeMetadata
|
|
181
|
+
});
|
|
182
|
+
Object.defineProperty(this, _getMetadataStream, {
|
|
183
|
+
value: getMetadataStream
|
|
184
|
+
});
|
|
185
|
+
Object.defineProperty(this, _providersMetadata, {
|
|
186
|
+
writable: true,
|
|
187
|
+
value: void 0
|
|
188
|
+
});
|
|
189
|
+
Object.defineProperty(this, _archive, {
|
|
190
|
+
writable: true,
|
|
191
|
+
value: void 0
|
|
192
|
+
});
|
|
193
|
+
Object.defineProperty(this, _diagnostics, {
|
|
194
|
+
writable: true,
|
|
195
|
+
value: void 0
|
|
196
|
+
});
|
|
197
|
+
this.name = 'destination::local-file';
|
|
198
|
+
this.type = 'destination';
|
|
199
|
+
this.results = {};
|
|
200
|
+
_class_private_field_loose_base(this, _providersMetadata)[_providersMetadata] = {};
|
|
201
|
+
_class_private_field_loose_base(this, _archive)[_archive] = {};
|
|
202
|
+
this.options = options;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
function reportInfo(message) {
|
|
206
|
+
_class_private_field_loose_base(this, _diagnostics)[_diagnostics]?.report({
|
|
207
|
+
details: {
|
|
208
|
+
createdAt: new Date(),
|
|
209
|
+
message,
|
|
210
|
+
origin: 'file-destination-provider'
|
|
211
|
+
},
|
|
212
|
+
kind: 'info'
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
function get_archivePath() {
|
|
216
|
+
const { encryption, compression, file } = this.options;
|
|
217
|
+
let filePath = `${file.path}.tar`;
|
|
218
|
+
if (compression.enabled) {
|
|
219
|
+
filePath += '.gz';
|
|
220
|
+
}
|
|
221
|
+
if (encryption.enabled) {
|
|
222
|
+
filePath += '.enc';
|
|
223
|
+
}
|
|
224
|
+
return filePath;
|
|
225
|
+
}
|
|
226
|
+
async function writeMetadata() {
|
|
227
|
+
_class_private_field_loose_base(this, _reportInfo)[_reportInfo]('writing metadata');
|
|
228
|
+
const metadata = _class_private_field_loose_base(this, _providersMetadata)[_providersMetadata].source;
|
|
229
|
+
if (metadata) {
|
|
230
|
+
await new Promise((resolve)=>{
|
|
231
|
+
const outStream = _class_private_field_loose_base(this, _getMetadataStream)[_getMetadataStream]();
|
|
232
|
+
const data = JSON.stringify(metadata, null, 2);
|
|
233
|
+
Readable.from(data).pipe(outStream).on('close', resolve);
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
function getMetadataStream() {
|
|
238
|
+
const { stream } = _class_private_field_loose_base(this, _archive)[_archive];
|
|
239
|
+
if (!stream) {
|
|
240
|
+
throw new Error('Archive stream is unavailable');
|
|
241
|
+
}
|
|
242
|
+
return createTarEntryStream(stream, ()=>'metadata.json');
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
export { createLocalFileDestinationProvider };
|
|
246
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../../../src/file/providers/destination/index.ts"],"sourcesContent":["import path from 'path';\nimport zlib from 'zlib';\nimport { Readable, Writable } from 'stream';\nimport { rm, createWriteStream } from 'fs-extra';\nimport tar from 'tar-stream';\nimport { stringer } from 'stream-json/jsonl/Stringer';\nimport { chain } from 'stream-chain';\n\nimport { createEncryptionCipher } from '../../../utils/encryption';\nimport type {\n IAsset,\n IDestinationProvider,\n IDestinationProviderTransferResults,\n IMetadata,\n ProviderType,\n Stream,\n} from '../../../../types';\nimport type { IDiagnosticReporter } from '../../../utils/diagnostic';\nimport { createFilePathFactory, createTarEntryStream } from './utils';\nimport { ProviderTransferError } from '../../../errors/providers';\n\nexport interface ILocalFileDestinationProviderOptions {\n encryption: {\n enabled: boolean; // if the file should be encrypted\n key?: string; // the key to use when encryption.enabled is true\n };\n\n compression: {\n enabled: boolean; // if the file should be compressed with gzip\n };\n\n file: {\n path: string; // the filename to create\n maxSize?: number; // the max size of a single backup file\n maxSizeJsonl?: number; // the max lines of each jsonl file before creating the next file\n };\n}\n\nexport interface ILocalFileDestinationProviderTransferResults\n extends IDestinationProviderTransferResults {\n file?: {\n path?: string;\n };\n}\n\nexport const createLocalFileDestinationProvider = (\n options: ILocalFileDestinationProviderOptions\n) => {\n return new LocalFileDestinationProvider(options);\n};\n\nclass LocalFileDestinationProvider implements IDestinationProvider {\n name = 'destination::local-file';\n\n type: ProviderType = 'destination';\n\n options: ILocalFileDestinationProviderOptions;\n\n results: ILocalFileDestinationProviderTransferResults = {};\n\n #providersMetadata: { source?: IMetadata; destination?: IMetadata } = {};\n\n #archive: { stream?: tar.Pack; pipeline?: Stream } = {};\n\n #diagnostics?: IDiagnosticReporter;\n\n constructor(options: ILocalFileDestinationProviderOptions) {\n this.options = options;\n }\n\n #reportInfo(message: string) {\n this.#diagnostics?.report({\n details: {\n createdAt: new Date(),\n message,\n origin: 'file-destination-provider',\n },\n kind: 'info',\n });\n }\n\n get #archivePath() {\n const { encryption, compression, file } = this.options;\n\n let filePath = `${file.path}.tar`;\n\n if (compression.enabled) {\n filePath += '.gz';\n }\n\n if (encryption.enabled) {\n filePath += '.enc';\n }\n\n return filePath;\n }\n\n setMetadata(target: ProviderType, metadata: IMetadata): IDestinationProvider {\n this.#providersMetadata[target] = metadata;\n\n return this;\n }\n\n createGzip(): zlib.Gzip {\n this.#reportInfo('creating gzip');\n return zlib.createGzip();\n }\n\n bootstrap(diagnostics: IDiagnosticReporter): void | Promise<void> {\n this.#diagnostics = diagnostics;\n const { compression, encryption } = this.options;\n\n if (encryption.enabled && !encryption.key) {\n throw new Error(\"Can't encrypt without a key\");\n }\n\n this.#archive.stream = tar.pack();\n\n const outStream = createWriteStream(this.#archivePath);\n\n outStream.on('error', (err: NodeJS.ErrnoException) => {\n if (err.code === 'ENOSPC') {\n throw new ProviderTransferError(\n \"Your server doesn't have space to proceed with the import.\"\n );\n }\n throw err;\n });\n\n const archiveTransforms: Stream[] = [];\n\n if (compression.enabled) {\n archiveTransforms.push(this.createGzip());\n }\n\n if (encryption.enabled && encryption.key) {\n archiveTransforms.push(createEncryptionCipher(encryption.key));\n }\n\n this.#archive.pipeline = chain([this.#archive.stream, ...archiveTransforms, outStream]);\n\n this.results.file = { path: this.#archivePath };\n }\n\n async close() {\n const { stream, pipeline } = this.#archive;\n\n if (!stream) {\n return;\n }\n\n await this.#writeMetadata();\n stream.finalize();\n\n if (pipeline && !pipeline.closed) {\n await new Promise<void>((resolve, reject) => {\n pipeline.on('close', resolve).on('error', reject);\n });\n }\n }\n\n async rollback(): Promise<void> {\n this.#reportInfo('rolling back');\n await this.close();\n await rm(this.#archivePath, { force: true });\n }\n\n getMetadata() {\n return null;\n }\n\n async #writeMetadata(): Promise<void> {\n this.#reportInfo('writing metadata');\n const metadata = this.#providersMetadata.source;\n\n if (metadata) {\n await new Promise((resolve) => {\n const outStream = this.#getMetadataStream();\n const data = JSON.stringify(metadata, null, 2);\n\n Readable.from(data).pipe(outStream).on('close', resolve);\n });\n }\n }\n\n #getMetadataStream() {\n const { stream } = this.#archive;\n\n if (!stream) {\n throw new Error('Archive stream is unavailable');\n }\n\n return createTarEntryStream(stream, () => 'metadata.json');\n }\n\n createSchemasWriteStream() {\n if (!this.#archive.stream) {\n throw new Error('Archive stream is unavailable');\n }\n this.#reportInfo('creating schemas write stream');\n const filePathFactory = createFilePathFactory('schemas');\n\n const entryStream = createTarEntryStream(\n this.#archive.stream,\n filePathFactory,\n this.options.file.maxSizeJsonl\n );\n\n return chain([stringer(), entryStream]);\n }\n\n createEntitiesWriteStream(): Writable {\n if (!this.#archive.stream) {\n throw new Error('Archive stream is unavailable');\n }\n this.#reportInfo('creating entities write stream');\n const filePathFactory = createFilePathFactory('entities');\n\n const entryStream = createTarEntryStream(\n this.#archive.stream,\n filePathFactory,\n this.options.file.maxSizeJsonl\n );\n\n return chain([stringer(), entryStream]);\n }\n\n createLinksWriteStream(): Writable {\n if (!this.#archive.stream) {\n throw new Error('Archive stream is unavailable');\n }\n this.#reportInfo('creating links write stream');\n const filePathFactory = createFilePathFactory('links');\n\n const entryStream = createTarEntryStream(\n this.#archive.stream,\n filePathFactory,\n this.options.file.maxSizeJsonl\n );\n\n return chain([stringer(), entryStream]);\n }\n\n createConfigurationWriteStream(): Writable {\n if (!this.#archive.stream) {\n throw new Error('Archive stream is unavailable');\n }\n this.#reportInfo('creating configuration write stream');\n const filePathFactory = createFilePathFactory('configuration');\n\n const entryStream = createTarEntryStream(\n this.#archive.stream,\n filePathFactory,\n this.options.file.maxSizeJsonl\n );\n\n return chain([stringer(), entryStream]);\n }\n\n createAssetsWriteStream(): Writable {\n const { stream: archiveStream } = this.#archive;\n\n if (!archiveStream) {\n throw new Error('Archive stream is unavailable');\n }\n\n this.#reportInfo('creating assets write stream');\n return new Writable({\n objectMode: true,\n write(data: IAsset, _encoding, callback) {\n // always write tar files with posix paths so we have a standard format for paths regardless of system\n const entryPath = path.posix.join('assets', 'uploads', data.filename);\n\n const entryMetadataPath = path.posix.join('assets', 'metadata', `${data.filename}.json`);\n const stringifiedMetadata = JSON.stringify(data.metadata);\n archiveStream.entry(\n {\n name: entryMetadataPath,\n size: stringifiedMetadata.length,\n },\n stringifiedMetadata\n );\n\n const entry = archiveStream.entry({\n name: entryPath,\n size: data.stats.size,\n });\n\n if (!entry) {\n callback(new Error(`Failed to created an asset tar entry for ${entryPath}`));\n return;\n }\n\n data.stream.pipe(entry);\n\n entry\n .on('finish', () => {\n callback(null);\n })\n .on('error', (error) => {\n callback(error);\n });\n },\n });\n }\n}\n"],"names":["createLocalFileDestinationProvider","options","LocalFileDestinationProvider","setMetadata","target","metadata","providersMetadata","createGzip","reportInfo","zlib","bootstrap","diagnostics","compression","encryption","enabled","key","Error","archive","stream","tar","pack","outStream","createWriteStream","archivePath","on","err","code","ProviderTransferError","archiveTransforms","push","createEncryptionCipher","pipeline","chain","results","file","path","close","writeMetadata","finalize","closed","Promise","resolve","reject","rollback","rm","force","getMetadata","createSchemasWriteStream","filePathFactory","createFilePathFactory","entryStream","createTarEntryStream","maxSizeJsonl","stringer","createEntitiesWriteStream","createLinksWriteStream","createConfigurationWriteStream","createAssetsWriteStream","archiveStream","Writable","objectMode","write","data","_encoding","callback","entryPath","posix","join","filename","entryMetadataPath","stringifiedMetadata","JSON","stringify","entry","name","size","length","stats","pipe","error","constructor","type","message","report","details","createdAt","Date","origin","kind","filePath","source","getMetadataStream","Readable","from"],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var stream = require('stream');
|
|
4
|
+
var path = require('path');
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Create a file path factory for a given path & prefix.
|
|
8
|
+
* Upon being called, the factory will return a file path for a given index
|
|
9
|
+
*/ const createFilePathFactory = (type)=>(fileIndex = 0)=>{
|
|
10
|
+
// always write tar files with posix paths so we have a standard format for paths regardless of system
|
|
11
|
+
return path.posix.join(// "{type}" directory
|
|
12
|
+
type, // "${type}_XXXXX.jsonl" file
|
|
13
|
+
`${type}_${String(fileIndex).padStart(5, '0')}.jsonl`);
|
|
14
|
+
};
|
|
15
|
+
const createTarEntryStream = (archive, pathFactory, maxSize = 2.56e8)=>{
|
|
16
|
+
let fileIndex = 0;
|
|
17
|
+
let buffer = '';
|
|
18
|
+
const flush = async ()=>{
|
|
19
|
+
if (!buffer) {
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
fileIndex += 1;
|
|
23
|
+
const name = pathFactory(fileIndex);
|
|
24
|
+
const size = buffer.length;
|
|
25
|
+
await new Promise((resolve, reject)=>{
|
|
26
|
+
archive.entry({
|
|
27
|
+
name,
|
|
28
|
+
size
|
|
29
|
+
}, buffer, (err)=>{
|
|
30
|
+
if (err) {
|
|
31
|
+
reject(err);
|
|
32
|
+
}
|
|
33
|
+
resolve();
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
buffer = '';
|
|
37
|
+
};
|
|
38
|
+
const push = (chunk)=>{
|
|
39
|
+
buffer += chunk;
|
|
40
|
+
};
|
|
41
|
+
return new stream.Writable({
|
|
42
|
+
async destroy (err, callback) {
|
|
43
|
+
await flush();
|
|
44
|
+
callback(err);
|
|
45
|
+
},
|
|
46
|
+
async write (chunk, _encoding, callback) {
|
|
47
|
+
const size = chunk.length;
|
|
48
|
+
if (chunk.length > maxSize) {
|
|
49
|
+
callback(new Error(`payload too large: ${chunk.length}>${maxSize}`));
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
if (buffer.length + size > maxSize) {
|
|
53
|
+
await flush();
|
|
54
|
+
}
|
|
55
|
+
push(chunk);
|
|
56
|
+
callback(null);
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
exports.createFilePathFactory = createFilePathFactory;
|
|
62
|
+
exports.createTarEntryStream = createTarEntryStream;
|
|
63
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sources":["../../../../src/file/providers/destination/utils.ts"],"sourcesContent":["import { Writable } from 'stream';\nimport { posix } from 'path';\nimport tar from 'tar-stream';\n\n/**\n * Create a file path factory for a given path & prefix.\n * Upon being called, the factory will return a file path for a given index\n */\nexport const createFilePathFactory =\n (type: string) =>\n (fileIndex = 0): string => {\n // always write tar files with posix paths so we have a standard format for paths regardless of system\n return posix.join(\n // \"{type}\" directory\n type,\n // \"${type}_XXXXX.jsonl\" file\n `${type}_${String(fileIndex).padStart(5, '0')}.jsonl`\n );\n };\n\nexport const createTarEntryStream = (\n archive: tar.Pack,\n pathFactory: (index?: number) => string,\n maxSize = 2.56e8\n) => {\n let fileIndex = 0;\n let buffer = '';\n\n const flush = async () => {\n if (!buffer) {\n return;\n }\n\n fileIndex += 1;\n const name = pathFactory(fileIndex);\n const size = buffer.length;\n\n await new Promise<void>((resolve, reject) => {\n archive.entry({ name, size }, buffer, (err) => {\n if (err) {\n reject(err);\n }\n\n resolve();\n });\n });\n\n buffer = '';\n };\n\n const push = (chunk: string | Buffer) => {\n buffer += chunk;\n };\n\n return new Writable({\n async destroy(err, callback) {\n await flush();\n callback(err);\n },\n\n async write(chunk, _encoding, callback) {\n const size = chunk.length;\n\n if (chunk.length > maxSize) {\n callback(new Error(`payload too large: ${chunk.length}>${maxSize}`));\n return;\n }\n\n if (buffer.length + size > maxSize) {\n await flush();\n }\n\n push(chunk);\n\n callback(null);\n },\n });\n};\n"],"names":["createFilePathFactory","type","fileIndex","posix","join","String","padStart","createTarEntryStream","archive","pathFactory","maxSize","buffer","flush","name","size","length","Promise","resolve","reject","entry","err","push","chunk","Writable","destroy","callback","write","_encoding","Error"],"mappings":";;;;;AAIA;;;AAGC,IACYA,MAAAA,qBAAAA,GACX,CAACC,IACD,GAAA,CAACC,YAAY,CAAC,GAAA;;QAEZ,OAAOC,UAAAA,CAAMC,IAAI;AAEfH,QAAAA,IAAAA;QAEA,CAAC,EAAEA,IAAK,CAAA,CAAC,EAAEI,MAAAA,CAAOH,SAAWI,CAAAA,CAAAA,QAAQ,CAAC,CAAA,EAAG,GAAK,CAAA,CAAA,MAAM,CAAC,CAAA;;MAI9CC,oBAAuB,GAAA,CAClCC,OACAC,EAAAA,WAAAA,EACAC,UAAU,MAAM,GAAA;AAEhB,IAAA,IAAIR,SAAY,GAAA,CAAA;AAChB,IAAA,IAAIS,MAAS,GAAA,EAAA;AAEb,IAAA,MAAMC,KAAQ,GAAA,UAAA;AACZ,QAAA,IAAI,CAACD,MAAQ,EAAA;AACX,YAAA;AACF;QAEAT,SAAa,IAAA,CAAA;AACb,QAAA,MAAMW,OAAOJ,WAAYP,CAAAA,SAAAA,CAAAA;QACzB,MAAMY,IAAAA,GAAOH,OAAOI,MAAM;QAE1B,MAAM,IAAIC,OAAc,CAAA,CAACC,OAASC,EAAAA,MAAAA,GAAAA;AAChCV,YAAAA,OAAAA,CAAQW,KAAK,CAAC;AAAEN,gBAAAA,IAAAA;AAAMC,gBAAAA;AAAK,aAAA,EAAGH,QAAQ,CAACS,GAAAA,GAAAA;AACrC,gBAAA,IAAIA,GAAK,EAAA;oBACPF,MAAOE,CAAAA,GAAAA,CAAAA;AACT;AAEAH,gBAAAA,OAAAA,EAAAA;AACF,aAAA,CAAA;AACF,SAAA,CAAA;QAEAN,MAAS,GAAA,EAAA;AACX,KAAA;AAEA,IAAA,MAAMU,OAAO,CAACC,KAAAA,GAAAA;QACZX,MAAUW,IAAAA,KAAAA;AACZ,KAAA;AAEA,IAAA,OAAO,IAAIC,eAAS,CAAA;QAClB,MAAMC,OAAAA,CAAAA,CAAQJ,GAAG,EAAEK,QAAQ,EAAA;YACzB,MAAMb,KAAAA,EAAAA;YACNa,QAASL,CAAAA,GAAAA,CAAAA;AACX,SAAA;AAEA,QAAA,MAAMM,KAAMJ,CAAAA,CAAAA,KAAK,EAAEK,SAAS,EAAEF,QAAQ,EAAA;YACpC,MAAMX,IAAAA,GAAOQ,MAAMP,MAAM;YAEzB,IAAIO,KAAAA,CAAMP,MAAM,GAAGL,OAAS,EAAA;gBAC1Be,QAAS,CAAA,IAAIG,KAAM,CAAA,CAAC,mBAAmB,EAAEN,KAAMP,CAAAA,MAAM,CAAC,CAAC,EAAEL,OAAAA,CAAQ,CAAC,CAAA,CAAA;AAClE,gBAAA;AACF;AAEA,YAAA,IAAIC,MAAOI,CAAAA,MAAM,GAAGD,IAAAA,GAAOJ,OAAS,EAAA;gBAClC,MAAME,KAAAA,EAAAA;AACR;YAEAS,IAAKC,CAAAA,KAAAA,CAAAA;YAELG,QAAS,CAAA,IAAA,CAAA;AACX;AACF,KAAA,CAAA;AACF;;;;;"}
|