[6a3a178] | 1 | const debug = require('debug')('streamroller:moveAndMaybeCompressFile');
|
---|
| 2 | const fs = require('fs-extra');
|
---|
| 3 | const zlib = require('zlib');
|
---|
| 4 |
|
---|
| 5 | const moveAndMaybeCompressFile = async (
|
---|
| 6 | sourceFilePath,
|
---|
| 7 | targetFilePath,
|
---|
| 8 | needCompress
|
---|
| 9 | ) => {
|
---|
| 10 | if (sourceFilePath === targetFilePath) {
|
---|
| 11 | debug(
|
---|
| 12 | `moveAndMaybeCompressFile: source and target are the same, not doing anything`
|
---|
| 13 | );
|
---|
| 14 | return;
|
---|
| 15 | }
|
---|
| 16 | if (await fs.pathExists(sourceFilePath)) {
|
---|
| 17 |
|
---|
| 18 | debug(
|
---|
| 19 | `moveAndMaybeCompressFile: moving file from ${sourceFilePath} to ${targetFilePath} ${
|
---|
| 20 | needCompress ? "with" : "without"
|
---|
| 21 | } compress`
|
---|
| 22 | );
|
---|
| 23 | if (needCompress) {
|
---|
| 24 | await new Promise((resolve, reject) => {
|
---|
| 25 | fs.createReadStream(sourceFilePath)
|
---|
| 26 | .pipe(zlib.createGzip())
|
---|
| 27 | .pipe(fs.createWriteStream(targetFilePath))
|
---|
| 28 | .on("finish", () => {
|
---|
| 29 | debug(
|
---|
| 30 | `moveAndMaybeCompressFile: finished compressing ${targetFilePath}, deleting ${sourceFilePath}`
|
---|
| 31 | );
|
---|
| 32 | fs.unlink(sourceFilePath)
|
---|
| 33 | .then(resolve)
|
---|
| 34 | .catch(() => {
|
---|
| 35 | debug(`Deleting ${sourceFilePath} failed, truncating instead`);
|
---|
| 36 | fs.truncate(sourceFilePath).then(resolve).catch(reject)
|
---|
| 37 | });
|
---|
| 38 | });
|
---|
| 39 | });
|
---|
| 40 | } else {
|
---|
| 41 | debug(
|
---|
| 42 | `moveAndMaybeCompressFile: deleting file=${targetFilePath}, renaming ${sourceFilePath} to ${targetFilePath}`
|
---|
| 43 | );
|
---|
| 44 | try {
|
---|
| 45 | await fs.move(sourceFilePath, targetFilePath, { overwrite: true });
|
---|
| 46 | } catch (e) {
|
---|
| 47 | debug(
|
---|
| 48 | `moveAndMaybeCompressFile: error moving ${sourceFilePath} to ${targetFilePath}`, e
|
---|
| 49 | );
|
---|
| 50 | debug(`Trying copy+truncate instead`);
|
---|
| 51 | await fs.copy(sourceFilePath, targetFilePath, { overwrite: true });
|
---|
| 52 | await fs.truncate(sourceFilePath);
|
---|
| 53 | }
|
---|
| 54 | }
|
---|
| 55 | }
|
---|
| 56 | };
|
---|
| 57 |
|
---|
| 58 | module.exports = moveAndMaybeCompressFile;
|
---|