| const debug = require('debug')('streamroller:moveAndMaybeCompressFile'); | |
| const realFs = require('fs'); | |
| const current = realFs.realpath.native; | |
| if (!realFs.realpath.native) realFs.realpath.native = realFs.realpath; | |
| let fs = require('fs-extra'); | |
| realFs.realpath.native = current; | |
| const zlib = require('zlib'); | |
| const _parseOption = function(rawOptions){ | |
| const defaultOptions = { | |
| mode: parseInt("0600", 8), | |
| compress: false, | |
| }; | |
| const options = Object.assign({}, defaultOptions, rawOptions); | |
| debug( | |
| `_parseOption: moveAndMaybeCompressFile called with option=${JSON.stringify(options)}` | |
| ); | |
| return options; | |
| } | |
| const moveAndMaybeCompressFile = async ( | |
| sourceFilePath, | |
| targetFilePath, | |
| options | |
| ) => { | |
| options = _parseOption(options); | |
| if (sourceFilePath === targetFilePath) { | |
| debug( | |
| `moveAndMaybeCompressFile: source and target are the same, not doing anything` | |
| ); | |
| return; | |
| } | |
| if (await fs.pathExists(sourceFilePath)) { | |
| debug( | |
| `moveAndMaybeCompressFile: moving file from ${sourceFilePath} to ${targetFilePath} ${ | |
| options.compress ? "with" : "without" | |
| } compress` | |
| ); | |
| if (options.compress) { | |
| await new Promise((resolve, reject) => { | |
| fs.createReadStream(sourceFilePath) | |
| .pipe(zlib.createGzip()) | |
| .pipe(fs.createWriteStream(targetFilePath, {mode: options.mode})) | |
| .on("finish", () => { | |
| debug( | |
| `moveAndMaybeCompressFile: finished compressing ${targetFilePath}, deleting ${sourceFilePath}` | |
| ); | |
| fs.unlink(sourceFilePath) | |
| .then(resolve) | |
| .catch(() => { | |
| debug(`Deleting ${sourceFilePath} failed, truncating instead`); | |
| fs.truncate(sourceFilePath).then(resolve).catch(reject) | |
| }); | |
| }); | |
| }); | |
| } else { | |
| debug( | |
| `moveAndMaybeCompressFile: deleting file=${targetFilePath}, renaming ${sourceFilePath} to ${targetFilePath}` | |
| ); | |
| try { | |
| await fs.move(sourceFilePath, targetFilePath, { overwrite: true }); | |
| } catch (e) { | |
| debug( | |
| `moveAndMaybeCompressFile: error moving ${sourceFilePath} to ${targetFilePath}`, e | |
| ); | |
| debug(`Trying copy+truncate instead`); | |
| await fs.copy(sourceFilePath, targetFilePath, { overwrite: true }); | |
| await fs.truncate(sourceFilePath); | |
| } | |
| } | |
| } | |
| }; | |
| module.exports = moveAndMaybeCompressFile; |