@strapi/data-transfer
Version:
Data transfer capabilities for Strapi
59 lines (55 loc) • 1.77 kB
JavaScript
;
var fs = require('fs');
var path = require('path');
var stream = require('stream');
/**
* JSONL writer that mirrors {@link createTarEntryStream} but writes files under a root directory.
*/ const createDirectoryJsonlWriter = (rootDir, pathFactory, maxSize = 2.56e8)=>{
let fileIndex = 0;
let buffer = '';
const resolvePath = (posixName)=>path.join(rootDir, ...posixName.split('/'));
const flush = async ()=>{
if (!buffer) {
return;
}
fileIndex += 1;
const name = pathFactory(fileIndex);
const targetPath = resolvePath(name);
await fs.promises.mkdir(path.dirname(targetPath), {
recursive: true
});
await fs.promises.writeFile(targetPath, buffer, 'utf8');
buffer = '';
};
const push = (chunk)=>{
buffer += chunk;
};
return new stream.Writable({
async final (callback) {
try {
await flush();
callback();
} catch (err) {
callback(err instanceof Error ? err : new Error(String(err)));
}
},
async destroy (err, callback) {
await flush();
callback(err);
},
async write (chunk, _encoding, callback) {
const size = chunk.length;
if (chunk.length > maxSize) {
callback(new Error(`payload too large: ${chunk.length}>${maxSize}`));
return;
}
if (buffer.length + size > maxSize) {
await flush();
}
push(chunk);
callback(null);
}
});
};
exports.createDirectoryJsonlWriter = createDirectoryJsonlWriter;
//# sourceMappingURL=utils.js.map