diff --git a/package-lock.json b/package-lock.json index b6dcfe3e..f4d149a7 100644 --- a/package-lock.json +++ b/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", diff --git a/package.json b/package.json index 99e0e533..3be87510 100644 --- a/package.json +++ b/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" } } diff --git a/server/controllers/WorkerController.js b/server/controllers/WorkerController.js index 54d229dc..86554ab4 100644 --- a/server/controllers/WorkerController.js +++ b/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(); diff --git a/server/core/Reader/ReaderWorker.js b/server/core/Reader/ReaderWorker.js index d2b6a92f..ef24a707 100644 --- a/server/core/Reader/ReaderWorker.js +++ b/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}); diff --git a/server/core/RemoteWebDavStorage.js b/server/core/RemoteWebDavStorage.js index e7d0ad83..21d0c107 100644 --- a/server/core/RemoteWebDavStorage.js +++ b/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) {