Browse Source

Небольшой рефакторинг

Book Pauk 5 years ago
parent
commit
1a487da3d9
3 changed files with 49 additions and 10 deletions
  1. 15 5
      server/core/FileDecompressor.js
  2. 9 5
      server/core/ReaderWorker.js
  3. 25 0
      server/core/utils.js

+ 15 - 5
server/core/FileDecompressor.js

@@ -1,6 +1,5 @@
 const fs = require('fs-extra');
 const fs = require('fs-extra');
 const zlib = require('zlib');
 const zlib = require('zlib');
-const crypto = require('crypto');
 const path = require('path');
 const path = require('path');
 const unbzip2Stream = require('unbzip2-stream');
 const unbzip2Stream = require('unbzip2-stream');
 const tar = require('tar-fs');
 const tar = require('tar-fs');
@@ -208,15 +207,26 @@ class FileDecompressor {
         });
         });
     }
     }
 
 
-    async gzipFileIfNotExists(filename, outDir) {
-        const buf = await fs.readFile(filename);
+    async gzipFile(inputFile, outputFile) {
+        return new Promise((resolve, reject) => {
+            const gzip = zlib.createGzip({level: 1});
+            const input = fs.createReadStream(inputFile);
+            const output = fs.createWriteStream(outputFile);
+
+            input.pipe(gzip).pipe(output).on('finish', (err) => {
+                if (err) reject(err);
+                else resolve();
+            });
+        });
+    }
 
 
-        const hash = crypto.createHash('sha256').update(buf).digest('hex');
+    async gzipFileIfNotExists(filename, outDir) {
+        const hash = await utils.getFileHash(filename, 'sha256', 'hex');
 
 
         const outFilename = `${outDir}/${hash}`;
         const outFilename = `${outDir}/${hash}`;
 
 
         if (!await fs.pathExists(outFilename)) {
         if (!await fs.pathExists(outFilename)) {
-            await fs.writeFile(outFilename, await this.gzipBuffer(buf))
+            await this.gzipFile(filename, outFilename);
         } else {
         } else {
             await utils.touchFile(outFilename);
             await utils.touchFile(outFilename);
         }
         }

+ 9 - 5
server/core/ReaderWorker.js

@@ -1,6 +1,5 @@
 const fs = require('fs-extra');
 const fs = require('fs-extra');
 const path = require('path');
 const path = require('path');
-const crypto = require('crypto');
 
 
 const workerState = require('./workerState');
 const workerState = require('./workerState');
 const FileDownloader = require('./FileDownloader');
 const FileDownloader = require('./FileDownloader');
@@ -9,6 +8,8 @@ const BookConverter = require('./BookConverter');
 const utils = require('./utils');
 const utils = require('./utils');
 const log = require('./getLogger').getLog();
 const log = require('./getLogger').getLog();
 
 
+const LibSharedStorage = require('./LibSharedStorage');
+
 let singleCleanExecute = false;
 let singleCleanExecute = false;
 
 
 class ReaderWorker {
 class ReaderWorker {
@@ -30,6 +31,12 @@ class ReaderWorker {
             this.periodicCleanDir(this.config.uploadDir, this.config.maxUploadPublicDirSize, 60*60*1000);//1 раз в час
             this.periodicCleanDir(this.config.uploadDir, this.config.maxUploadPublicDirSize, 60*60*1000);//1 раз в час
             singleCleanExecute = true;
             singleCleanExecute = true;
         }
         }
+
+        (async() => {
+            const libSharedStorage = new LibSharedStorage();
+            await libSharedStorage.init(config);
+            libSharedStorage.filenameToStoragePath('/home/sizikov/Downloads/15/1.zip');
+        })();
     }
     }
 
 
     async loadBook(opts, wState) {
     async loadBook(opts, wState) {
@@ -117,10 +124,7 @@ class ReaderWorker {
     }
     }
 
 
     async saveFile(file) {
     async saveFile(file) {
-        const buf = await fs.readFile(file.path);
-
-        const hash = crypto.createHash('sha256').update(buf).digest('hex');
-
+        const hash = await utils.getFileHash(file.path, 'sha256', 'hex');
         const outFilename = `${this.config.uploadDir}/${hash}`;
         const outFilename = `${this.config.uploadDir}/${hash}`;
 
 
         if (!await fs.pathExists(outFilename)) {
         if (!await fs.pathExists(outFilename)) {

+ 25 - 0
server/core/utils.js

@@ -1,6 +1,28 @@
 const { spawn } = require('child_process');
 const { spawn } = require('child_process');
 const fs = require('fs-extra');
 const fs = require('fs-extra');
 const crypto = require('crypto');
 const crypto = require('crypto');
+const baseX = require('base-x');
+
+const BASE36 = '0123456789abcdefghijklmnopqrstuvwxyz';
+const bs36 = baseX(BASE36);
+
+function toBase36(data) {
+    return bs36.encode(Buffer.from(data));
+}
+
+function fromBase36(data) {
+    return bs36.decode(data);
+}
+
+function getFileHash(filename, hashName, enc) {
+    return new Promise((resolve, reject) => {
+        const hash = crypto.createHash(hashName);
+        const rs = fs.createReadStream(filename);
+        rs.on('error', reject);
+        rs.on('data', chunk => hash.update(chunk));
+        rs.on('end', () => resolve(hash.digest(enc)));
+    });
+}
 
 
 function sleep(ms) {
 function sleep(ms) {
     return new Promise(resolve => setTimeout(resolve, ms));
     return new Promise(resolve => setTimeout(resolve, ms));
@@ -54,6 +76,9 @@ function spawnProcess(cmd, opts) {
 }
 }
 
 
 module.exports = {
 module.exports = {
+    toBase36,
+    fromBase36,
+    getFileHash,
     sleep,
     sleep,
     randomHexString,
     randomHexString,
     touchFile,
     touchFile,