FileDecompressor.js 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. const fs = require('fs-extra');
  2. const zlib = require('zlib');
  3. const crypto = require('crypto');
  4. const utils = require('./utils');
  5. const decompress = require('decompress');
  6. const FileDetector = require('./FileDetector');
  7. class FileDecompressor {
  8. constructor() {
  9. this.detector = new FileDetector();
  10. }
  11. async decompressFile(filename, outputDir) {
  12. const fileType = await this.detector.detectFile(filename);
  13. if (!fileType || !(fileType.ext == 'zip' || fileType.ext == 'bz2'))
  14. return filename;
  15. const files = await decompress(filename, outputDir);
  16. let result = filename;
  17. let max = 0;
  18. if (files.length) {
  19. //ищем файл с максимальным размером
  20. for (let file of files) {
  21. if (file.data.length > max) {
  22. result = `${outputDir}/${file.path}`;
  23. max = file.data.length;
  24. }
  25. }
  26. }
  27. return result;
  28. }
  29. async gzipBuffer(buf) {
  30. return new Promise((resolve, reject) => {
  31. zlib.gzip(buf, {level: 1}, (err, result) => {
  32. if (err) reject(err);
  33. resolve(result);
  34. });
  35. });
  36. }
  37. async gzipFileIfNotExists(filename, outDir) {
  38. const buf = await fs.readFile(filename);
  39. const hash = crypto.createHash('sha256').update(buf).digest('hex');
  40. const outFilename = `${outDir}/${hash}`;
  41. if (!await fs.pathExists(outFilename)) {
  42. await fs.writeFile(outFilename, await this.gzipBuffer(buf))
  43. } else {
  44. await utils.touchFile(outFilename);
  45. }
  46. return outFilename;
  47. }
  48. }
  49. module.exports = FileDecompressor;