Browse Source

Merge branch 'release/0.8.2-1'

Book Pauk 5 years ago
parent
commit
440d1b3ba0

+ 1 - 9
package-lock.json

@@ -1,6 +1,6 @@
 {
   "name": "Liberama",
-  "version": "0.8.1",
+  "version": "0.8.2",
   "lockfileVersion": 1,
   "requires": true,
   "dependencies": {
@@ -12807,14 +12807,6 @@
         }
       }
     },
-    "webdav-fs": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/webdav-fs/-/webdav-fs-2.0.0.tgz",
-      "integrity": "sha512-TjqQKNnf1NuPiMEFJVrmWUYpIEgUxWRktddu5JhQsyxFIOyAJT0cpLyaoOdAp/yrG1yXgDsa6ZL9z+h4Z71zWA==",
-      "requires": {
-        "webdav": "^2.0.0"
-      }
-    },
     "webpack": {
       "version": "4.40.2",
       "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.40.2.tgz",

+ 1 - 1
package.json

@@ -84,7 +84,7 @@
     "vue-router": "^3.1.3",
     "vuex": "^3.1.1",
     "vuex-persistedstate": "^2.5.4",
-    "webdav-fs": "^2.0.0",
+    "webdav": "^2.10.1",
     "zip-stream": "^2.1.2"
   }
 }

+ 5 - 1
server/controllers/WorkerController.js

@@ -38,7 +38,7 @@ class WorkerController extends BaseController {
             });
 
             const splitter = '-- aod2t5hDXU32bUFyqlFE next status --';            
-            const refreshPause = 300;
+            const refreshPause = 200;
             let i = 0;
             let prevProgress = -1;
             let prevState = '';
@@ -47,6 +47,10 @@ class WorkerController extends BaseController {
                 state = this.workerState.getState(request.workerId);
                 if (!state) break;
 
+                if (i == 0) {
+                    state = Object.assign({dummy: '0'.repeat(1024)}, state);
+                }
+
                 res.write(splitter + JSON.stringify(state));
                 res.flush();
 

+ 20 - 3
server/core/Reader/ReaderWorker.js

@@ -10,6 +10,8 @@ const RemoteWebDavStorage = require('../RemoteWebDavStorage');
 const utils = require('../utils');
 const log = new (require('../AppLogger'))().log;//singleton
 
+const cleanDirPeriod = 60*60*1000;//1 раз в час
+
 let instance = null;
 
 //singleton
@@ -31,11 +33,13 @@ class ReaderWorker {
 
             this.remoteWebDavStorage = false;
             if (config.remoteWebDavStorage) {
-                this.remoteWebDavStorage = new RemoteWebDavStorage(config.remoteWebDavStorage);
+                this.remoteWebDavStorage = new RemoteWebDavStorage(
+                    Object.assign({maxContentLength: config.maxUploadFileSize}, config.remoteWebDavStorage)
+                );
             }
 
-            this.periodicCleanDir(this.config.tempPublicDir, this.config.maxTempPublicDirSize, 60*60*1000);//1 раз в час
-            this.periodicCleanDir(this.config.uploadDir, this.config.maxUploadPublicDirSize, 60*60*1000);//1 раз в час
+            this.periodicCleanDir(this.config.tempPublicDir, this.config.maxTempPublicDirSize, cleanDirPeriod);
+            this.periodicCleanDir(this.config.uploadDir, this.config.maxUploadPublicDirSize, cleanDirPeriod);
             
             instance = this;
         }
@@ -101,6 +105,19 @@ class ReaderWorker {
             const finishFilename = path.basename(compFilename);
             wState.finish({path: `/tmp/${finishFilename}`, size: stat.size});
 
+            //лениво сохраним compFilename в удаленном хранилище
+            if (this.remoteWebDavStorage) {
+                (async() => {
+                    await utils.sleep(20*1000);
+                    try {
+                        //log(`remoteWebDavStorage.putFile ${path.basename(compFilename)}`);
+                        await this.remoteWebDavStorage.putFile(compFilename);
+                    } catch (e) {
+                        log(LM_ERR, e.stack);
+                    }
+                })();
+            }
+
         } catch (e) {
             log(LM_ERR, e.stack);
             wState.set({state: 'error', error: e.message});

+ 29 - 43
server/core/RemoteWebDavStorage.js

@@ -1,62 +1,48 @@
 const fs = require('fs-extra');
 const path = require('path');
 
-const WebDavFS = require('webdav-fs');
+const { createClient } = require('webdav');
 
 class RemoteWebDavStorage {
     constructor(config) {
-        const opts = Object.assign({}, config);
-        this.wfs = WebDavFS(config.url, opts);
+        this.config = Object.assign({}, config);
+        this.config.maxContentLength = this.config.maxContentLength || 10*1024*1024;
+        this.wdc = createClient(config.url, this.config);
     }
 
-    stat(filename) {
-        return new Promise((resolve, reject) => {
-            this.wfs.stat(filename, function(err, fileStat) {
-                if (err)
-                    reject(err);
-                resolve(fileStat);
-            });
-        });
+    _convertStat(data) {
+        return {
+            isDirectory: function() {
+                return data.type === "directory";
+            },
+            isFile: function() {
+                return data.type === "file";
+            },
+            mtime: (new Date(data.lastmod)).getTime(),
+            name: data.basename,
+            size: data.size || 0
+        };
     }
 
-    writeFile(filename, data) {
-        return new Promise((resolve, reject) => {
-            this.wfs.writeFile(filename, data, 'binary', function(err) {
-                if (err)
-                    reject(err);
-                resolve();
-            });
-        });
+    async stat(filename) {
+        const stat = await this.wdc.stat(filename);
+        return this._convertStat(stat);
     }
 
-    unlink(filename) {
-        return new Promise((resolve, reject) => {
-            this.wfs.unlink(filename, function(err) {
-                if (err)
-                    reject(err);
-                resolve();
-            });        
-        });
+    async writeFile(filename, data) {
+        return await this.wdc.putFileContents(filename, data, { maxContentLength: this.config.maxContentLength })
     }
 
-    readFile(filename) {
-        return new Promise((resolve, reject) => {
-            this.wfs.readFile(filename, 'binary', function(err, data) {
-                if (err)
-                    reject(err);
-                resolve(data);
-            });        
-        });
+    async unlink(filename) {
+        return await this.wdc.deleteFile(filename);
     }
 
-    mkdir(dirname) {
-        return new Promise((resolve, reject) => {
-            this.wfs.mkdir(dirname, function(err) {
-                if (err)
-                    reject(err);
-                resolve();
-            });
-        });
+    async readFile(filename) {
+        return await this.wdc.getFileContents(filename, { maxContentLength: this.config.maxContentLength })
+    }
+
+    async mkdir(dirname) {
+        return await this.wdc.createDirectory(dirname);
     }
 
     async putFile(filename) {