@strapi/data-transfer
Version:
Data transfer capabilities for Strapi
57 lines (54 loc) • 1.72 kB
JavaScript
import { promises } from 'fs';
import path from 'path';
import { Writable } from '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 promises.mkdir(path.dirname(targetPath), {
recursive: true
});
await promises.writeFile(targetPath, buffer, 'utf8');
buffer = '';
};
const push = (chunk)=>{
buffer += chunk;
};
return new 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);
}
});
};
export { createDirectoryJsonlWriter };
//# sourceMappingURL=utils.mjs.map