diff --git a/server/config/base.js b/server/config/base.js index 0ec65f87..4789cdc1 100644 --- a/server/config/base.js +++ b/server/config/base.js @@ -21,6 +21,8 @@ module.exports = { maxTempPublicDirSize: 512*1024*1024,//512Мб maxUploadPublicDirSize: 200*1024*1024,//100Мб + useExternalBookConverter: false, + servers: [ { serverName: '1', diff --git a/server/config/configSaver.js b/server/config/configSaver.js index f39b920f..f4844a5c 100644 --- a/server/config/configSaver.js +++ b/server/config/configSaver.js @@ -5,7 +5,8 @@ const propsToSave = [ 'maxUploadFileSize', 'maxTempPublicDirSize', 'maxUploadPublicDirSize', - + 'useExternalBookConverter', + 'servers', ]; diff --git a/server/core/BookConverter/ConvertDocX.js b/server/core/BookConverter/ConvertDocX.js new file mode 100644 index 00000000..6449a1ed --- /dev/null +++ b/server/core/BookConverter/ConvertDocX.js @@ -0,0 +1,18 @@ +const ConvertBase = require('./ConvertBase'); + +class ConvertDocX extends ConvertBase { + check(data, opts) { + const {fileType} = opts; + + return (fileType && fileType.ext == 'docx' && this.config.useExternalBookConverter); + } + + run(data, opts) { + if (!this.check(data, opts)) + return false; + + return data; + } +} + +module.exports = ConvertDocX; diff --git a/server/core/BookConverter/index.js b/server/core/BookConverter/index.js index 8d9a6fd3..6b38935b 100644 --- a/server/core/BookConverter/index.js +++ b/server/core/BookConverter/index.js @@ -3,6 +3,7 @@ const FileDetector = require('../FileDetector'); //порядок важен const convertClassFactory = [ + //require('./ConvertDocX'), require('./ConvertFb2'), require('./ConvertSamlib'), require('./ConvertHtml'), diff --git a/server/core/utils.js b/server/core/utils.js index f37ef205..4b84c33d 100644 --- a/server/core/utils.js +++ b/server/core/utils.js @@ -1,3 +1,4 @@ +const { spawn } = require('child_process'); const fs = require('fs-extra'); const crypto = require('crypto'); @@ -13,8 +14,46 @@ async function touchFile(filename) { await fs.utimes(filename, Date.now()/1000, Date.now()/1000); } +function spawnProcess(cmd, opts) { + let {args, killAfter, onData} = opts; + killAfter = (killAfter ? killAfter : 30*1000); + onData = (onData ? onData : () => {}); + args = (args ? args : []); + + return new Promise(async(resolve, reject) => { + let resolved = false; + const proc = spawn(cmd, args); + + let stdout = ''; + proc.stdout.on('data', (data) => { + stdout += data; + onData(data); + }); + + let stderr = ''; + proc.stderr.on('data', (data) => { + stderr += data; + onData(data); + }); + + proc.on('close', (code) => { + resolved = true; + resolve({status: 'close', code, stdout, stderr}); + }); + + proc.on('error', (error) => { + reject({status: 'error', error, stdout, stderr}); + }); + + await sleep(killAfter); + if (!resolved) + reject({status: 'killed', stdout, stderr}); + }); +} + module.exports = { sleep, randomHexString, - touchFile + touchFile, + spawnProcess }; \ No newline at end of file