From 7ab5db051e29a75450444ed6c87f35c1bfad95c4 Mon Sep 17 00:00:00 2001 From: "Alexey.Golubev" Date: Tue, 1 Sep 2015 17:06:32 +0000 Subject: [PATCH] './config.json' -> 'config' git-svn-id: svn://192.168.3.15/activex/AVS/Sources/TeamlabOffice/trunk/nodeJSProjects@64458 954022d7-b5bf-4e40-9824-e11837661b57 --- CoAuthoring/sources/DocsCoServer.js | 34 ++++++++-------- CoAuthoring/sources/canvasservice.js | 2 +- CoAuthoring/sources/converterservice.js | 2 +- CoAuthoring/sources/fileuploaderservice.js | 4 +- CoAuthoring/sources/mySqlBaseConnector.js | 2 +- .../sources/postgreSqlBaseConnector.js | 7 ++-- CoAuthoring/sources/pubsubRabbitMQ.js | 3 +- CoAuthoring/sources/pubsubRedis.js | 10 ++--- CoAuthoring/sources/server.js | 40 +++++++++---------- Common/sources/logger.js | 4 +- Common/sources/rabbitMQCore.js | 18 ++++----- Common/sources/storage-base.js | 2 +- Common/sources/storage-fs.js | 2 +- Common/sources/storage-s3.js | 2 +- Common/sources/taskqueueDB.js | 6 +-- Common/sources/taskqueueRabbitMQ.js | 8 ++-- 16 files changed, 72 insertions(+), 74 deletions(-) diff --git a/CoAuthoring/sources/DocsCoServer.js b/CoAuthoring/sources/DocsCoServer.js index 42e1cf91..4e203f59 100644 --- a/CoAuthoring/sources/DocsCoServer.js +++ b/CoAuthoring/sources/DocsCoServer.js @@ -42,7 +42,7 @@ *----------------------------------------------------------------------------------------------------------------------- * */ -var configCommon = require('././../../Common/sources/config.json'); +var configCommon = require('config'); var sockjs = require('sockjs'), _ = require('underscore'), https = require('https'), @@ -54,27 +54,27 @@ var sockjs = require('sockjs'), constants = require('./../../Common/sources/constants'), utils = require('./../../Common/sources/utils'), commonDefines = require('./../../Common/sources/commondefines'), - config = require('./config.json'), + config = require('config').get('services.CoAuthoring'), sqlBase = require('./baseConnector'), taskResult = require('./taskresult'); canvasService = require('./canvasservice'); -var redis = require(config['redis']['name']); -var pubsubService = require('./' + config['pubsub']['name']); -var queueService = require('./../../Common/sources/' + configCommon['queue']['name']); +var redis = require(config.get('redis.name')); +var pubsubService = require('./' + config.get('pubsub.name')); +var queueService = require('./../../Common/sources/' + configCommon.get('queue.name')); -var cfgPubSubMaxChanges = config['pubsub']['maxChanges']; +var cfgPubSubMaxChanges = config.get('pubsub.maxChanges'); -var cfgRedisPrefix = config['redis']['prefix']; -var cfgRedisHost = config['redis']['callback']; -var cfgRedisPort = config['redis']['port']; -var cfgExpCallback = config['expire']['callback']; -var cfgExpSaveLock = config['expire']['saveLock']; -var cfgExpLockDoc = config['expire']['lockDoc']; -var cfgExpDocuments = config['expire']['documents']; -var cfgExpDocumentsCron = config['expire']['documentsCron']; -var cfgExpFiles = config['expire']['files']; -var cfgExpFilesCron = config['expire']['filesCron']; -var cfgExpMessage = config['expire']['message']; +var cfgRedisPrefix = config.get('redis.prefix'); +var cfgRedisHost = config.get('redis.callback'); +var cfgRedisPort = config.get('redis.port'); +var cfgExpCallback = config.get('expire.callback'); +var cfgExpSaveLock = config.get('expire.saveLock'); +var cfgExpLockDoc = config.get('expire.lockDoc'); +var cfgExpDocuments = config.get('expire.documents'); +var cfgExpDocumentsCron = config.get('expire.documentsCron'); +var cfgExpFiles = config.get('expire.files'); +var cfgExpFilesCron = config.get('expire.filesCron'); +var cfgExpMessage = config.get('expire.message'); var redisKeyCallback = cfgRedisPrefix + 'callback:'; var redisKeyUserIndex = cfgRedisPrefix + 'userindex:'; diff --git a/CoAuthoring/sources/canvasservice.js b/CoAuthoring/sources/canvasservice.js index e1cb0cbd..f48e6502 100644 --- a/CoAuthoring/sources/canvasservice.js +++ b/CoAuthoring/sources/canvasservice.js @@ -1 +1 @@ -var sqlBase = require('./baseConnector'); var docsCoServer = require('./DocsCoServer'); var taskResult = require('./taskresult'); var logger = require('./../../Common/sources/logger'); var utils = require('./../../Common/sources/utils'); var constants = require('./../../Common/sources/constants'); var commonDefines = require('./../../Common/sources/commondefines'); var storage = require('./../../Common/sources/storage-base'); var formatChecker = require('./../../Common/sources/formatchecker'); var config = require('./config.json'); var cfgAutosaveEnable = config['server']['editor.settings.autosave.enable1']; var cfgAutosaveMininterval = config['server']['editor.settings.autosave.mininterval1']; var cfgCoauthoringUrl = config['server']['editor.settings.coauthoring.url']; var cfgSpellcheckerUrl = config['server']['editor.settings.spellchecker.url']; var cfgAnalyticsEnable = config['server']['editor.settings.analytics.enable']; var cfgActiveconnectionsTrackingInterval = config['server']['license.activeconnections.tracking.interval']; var cfgReaderformats = config['server']['editor.settings.readerformats']; var cfgEditorformats = config['server']['editor.settings.editorformats']; var cfgViewerformats = config['server']['editor.settings.viewerformats']; var cfgTypesUpload = config['utils']['limits.image.types.upload']; var cfgTypesCopy = config['utils']['limits.image.types.copy']; var cfgImageSize = config['server']['limits.image.size']; var SAVE_TYPE_PART_START = 0; var SAVE_TYPE_PART = 1; var SAVE_TYPE_COMPLETE = 2; var SAVE_TYPE_COMPLETE_ALL = 3; function OutputDataWrap(type, data) { this['type'] = type; this['data'] = data; } OutputDataWrap.prototype = { fromObject: function(data) { this['type'] = data['type']; this['data'] = new OutputData(); this['data'].fromObject(data['data']); }, getType: function() { return this['type']; }, setType: function(data) { this['type'] = data; }, getData: function() { return this['data']; }, setData: function(data) { this['data'] = data; } }; function OutputData(type) { this['type'] = type; this['status'] = undefined; this['data'] = undefined; } OutputData.prototype = { fromObject: function(data) { this['type'] = data['type']; this['status'] = data['status']; this['data'] = data['data']; }, getType: function() { return this['type']; }, setType: function(data) { this['type'] = data; }, getStatus: function() { return this['status']; }, setStatus: function(data) { this['status'] = data; }, getData: function() { return this['data']; }, setData: function(data) { this['data'] = data; } }; function OutputSettingsData(rights, format, trackingInfo) { this['canEdit'] = true; this['canDownload'] = true; this['canCoAuthoring'] = true; this['canReaderMode'] = true; this['canAd'] = true; this['canBranding'] = true; this['isAutosaveEnable'] = cfgAutosaveEnable || true; this['AutosaveMinInterval'] = cfgAutosaveMininterval || 300; this['g_cAscCoAuthoringUrl'] = cfgCoauthoringUrl || ''; //так имена переменных написаны в JS this['g_cAscSpellCheckUrl'] = cfgSpellcheckerUrl || ''; //чтобы не светить лишние имена здесь используются такие же. this['isAnalyticsEnable'] = cfgAnalyticsEnable || false; this['trackingInfo'] = undefined; this['TrackingInterval'] = cfgActiveconnectionsTrackingInterval || 300; if (format) { format = format.toLowerCase(); var readerFormats = cfgReaderformats || ''; var readerFormatsArray = readerFormats.split(/[|,;]/); this['canReaderMode'] = -1 != readerFormatsArray.indexOf(format); var editorformats = cfgEditorformats || ''; var editorformatsArray = editorformats.split(/[|,;]/); this['canEdit'] = -1 != editorformatsArray.indexOf(format); var viewerformats = cfgViewerformats || ''; var viewerformatsArray = viewerformats.split(/[|,;]/); this['canDownload'] = -1 != viewerformatsArray.indexOf(format); } if (rights) { //todo } if (trackingInfo) { //todo } } function OutputSfcData() { this['key'] = undefined; this['status'] = undefined; this['url'] = undefined; this['changesurl'] = undefined; this['changeshistory'] = undefined; this['users'] = []; this['mailMerge'] = undefined; } OutputSfcData.prototype = { getKey: function() { return this['key']; }, setKey: function(data) { return this['key'] = data; }, getStatus: function() { return this['status']; }, setStatus: function(data) { return this['status'] = data; }, getUrl: function() { return this['url']; }, setUrl: function(data) { return this['url'] = data; }, getChangeUrl: function() { return this['changesurl']; }, setChangeUrl: function(data) { return this['changesurl'] = data; }, getChangeHistory: function() { return this['changeshistory']; }, setChangeHistory: function(data) { return this['changeshistory'] = data; }, getUsers: function() { return this['users']; }, setUsers: function(data) { return this['users'] = data; }, getMailMerge: function() { return this['mailMerge']; }, setMailMerge: function(data) { return this['mailMerge'] = data; } }; function OutputMailMerge(mailMergeSendData) { if (mailMergeSendData) { this['from'] = mailMergeSendData.getFrom(); this['message'] = mailMergeSendData.getMessage(); this['subject'] = mailMergeSendData.getSubject(); this['title'] = mailMergeSendData.getFileName(); var mailFormat = mailMergeSendData.getMailFormat(); switch (mailFormat) { case constants.AVS_OFFICESTUDIO_FILE_OTHER_HTMLZIP : this['type'] = 0; break; case constants.AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX : this['type'] = 1; break; case constants.AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF : this['type'] = 2; break; default : this['type'] = 0; break; } this['recordCount'] = mailMergeSendData.getRecordCount(); this['to'] = null; this['recordIndex'] = null; } else { this['from'] = null; this['message'] = null; this['subject'] = null; this['title'] = null; this['to'] = null; this['type'] = null; this['recordCount'] = null; this['recordIndex'] = null; } } OutputMailMerge.prototype = { getRecordIndex: function() { return this['recordIndex']; }, setRecordIndex: function(data) { return this['recordIndex'] = data; }, getTo: function() { return this['to']; }, setTo: function(data) { return this['to'] = data; } }; function getInsertStatisticString(affiliateId, filename, tag) { var dateNow = sqlBase.getDateTime(new Date()); var commandArg = [affiliateId, filename, dateNow, tag]; var commandArgEsc = commandArg.map(function(curVal) { return sqlBase.baseConnector.sqlEscape(curVal) }); return 'INSERT INTO file_statistic2 (fsc_affiliate, fsc_filename, fsc_time, fsc_tag) ' + 'VALUES (' + commandArgEsc.join(', ') + ');'; } function insertStatistic(affiliateId, filename, tag) { return new Promise(function(resolve, reject) { var sqlCommand = getInsertStatisticString(affiliateId, filename, tag); sqlBase.baseConnector.sqlQuery(sqlCommand, function(error, result) { if (error) { reject(error); } else { resolve(result); } }); }); } function* getOutputData(cmd, outputData, key, status, statusInfo, optConn, optAdditionalOutput) { switch (status) { case taskResult.FileStatus.Ok: //todo affilate var tag; var affiliateId = 'affiliateId'; switch (cmd.getEditorId()) { // case (int)LicenseInfo.EditorType.Spreadsheet: tag = 'open_sheet'; break; // case (int)LicenseInfo.EditorType.Presentation: tag = 'open_presentation'; break; default: tag = 'open_word'; break; } yield insertStatistic(affiliateId, cmd.getDocId(), tag); outputData.setStatus('ok'); if (optConn) { outputData.setData(yield storage.getSignedUrls(optConn.baseUrl, key)); } else if (optAdditionalOutput) { optAdditionalOutput.needUrlKey = key; optAdditionalOutput.needUrlMethod = 0; } break; case taskResult.FileStatus.NeedParams: outputData.setStatus('needparams'); var settingsPath = key + '/' + 'settings.json'; if (optConn) { outputData.setData(yield storage.getSignedUrl(optConn.baseUrl, settingsPath)); } else if (optAdditionalOutput) { optAdditionalOutput.needUrlKey = settingsPath; optAdditionalOutput.needUrlMethod = 1; } break; case taskResult.FileStatus.Err: case taskResult.FileStatus.ErrToReload: outputData.setStatus('err'); outputData.setData(statusInfo); break; case taskResult.FileStatus.SaveVersion: case taskResult.FileStatus.UpdateVersion: outputData.setStatus('updateversion'); break; } } function* addRandomKeyTaskCmd(cmd) { var task = yield* taskResult.addRandomKeyTask(cmd.getDocId()); cmd.setSaveKey(task.key); } function* saveParts(cmd) { var result = false; var saveType = cmd.getSaveType(); var filename; if (SAVE_TYPE_COMPLETE_ALL === saveType) { filename = 'Editor.bin'; } else { filename = 'Editor' + (cmd.getSaveIndex() || '') + '.bin'; } if (SAVE_TYPE_PART_START === saveType || SAVE_TYPE_COMPLETE_ALL === saveType) { yield* addRandomKeyTaskCmd(cmd); } if (cmd.getUrl()) { result = true; } else { var buffer = cmd.getData(); yield storage.putObject(cmd.getSaveKey() + '/' + filename, buffer, buffer.length); //delete data to prevent serialize into json cmd.data = null; result = (SAVE_TYPE_COMPLETE_ALL === saveType || SAVE_TYPE_COMPLETE === saveType); } return result; } function getSaveTask(cmd) { cmd.setData(null); var queueData = new commonDefines.TaskQueueData(); queueData.setCmd(cmd); queueData.setToFile('output.' + formatChecker.getStringFromFormat(cmd.getOutputFormat())); //todo paid //if (cmd.vkey) { // bool // bPaid; // Signature.getVKeyParams(cmd.vkey, out bPaid); // oTaskQueueData.m_bPaid = bPaid; //} return queueData; } function getUpdateResponse(cmd) { var updateTask = new taskResult.TaskResultData(); updateTask.key = cmd.getSaveKey() ? cmd.getSaveKey() : cmd.getDocId(); var statusInfo = cmd.getStatusInfo(); if (constants.NO_ERROR == statusInfo) { updateTask.status = taskResult.FileStatus.Ok; } else if (constants.CONVERT_DOWNLOAD == statusInfo) { updateTask.status = taskResult.FileStatus.ErrToReload; } else { updateTask.status = taskResult.FileStatus.Err; } updateTask.statusInfo = statusInfo; if (cmd.getTitle()) { updateTask.title = cmd.getTitle(); } return updateTask; } function* commandOpen(conn, cmd, outputData) { var task = new taskResult.TaskResultData(); task.key = cmd.getDocId(); task.format = cmd.getFormat(); task.status = taskResult.FileStatus.WaitQueue; task.statusInfo = constants.NO_ERROR; task.title = cmd.getTitle(); var upsertRes = yield taskResult.upsert(task); //var bCreate = (upsertRes.affectedRows == 1); var bExist = (upsertRes.affectedRows > 1); if (bExist) { var selectRes = yield taskResult.select(task); if (selectRes.length > 0) { var row = selectRes[0]; yield* getOutputData(cmd, outputData, cmd.getDocId(), row.tr_status, row.tr_status_info, conn); } } else { //add task cmd.setOutputFormat(constants.AVS_OFFICESTUDIO_FILE_CANVAS); cmd.setEmbeddedFonts(false); var dataQueue = new commonDefines.TaskQueueData(); dataQueue.setCmd(cmd); dataQueue.setToFile('Editor.bin'); yield* docsCoServer.addTask(dataQueue, constants.QUEUE_PRIORITY_HIGH); } } function* commandReopen(cmd) { var task = new taskResult.TaskResultData(); task.status = taskResult.FileStatus.WaitQueue; task.statusInfo = constants.NO_ERROR; var upsertRes = yield taskResult.update(task); if (upsertRes.affectedRows > 1) { //add task cmd.setSaveKey(cmd.getDocId()); cmd.setOutputFormat(constants.AVS_OFFICESTUDIO_FILE_CANVAS); cmd.setEmbeddedFonts(false); var dataQueue = new commonDefines.TaskQueueData(); dataQueue.setCmd(cmd); dataQueue.setToFile('Editor.bin'); dataQueue.setFromSettings(true); yield* docsCoServer.addTask(dataQueue, constants.QUEUE_PRIORITY_HIGH); } } function* commandSave(cmd, outputData) { var completeParts = yield* saveParts(cmd); if (completeParts) { var queueData = getSaveTask(cmd); yield* docsCoServer.addTask(queueData, constants.QUEUE_PRIORITY_LOW); } outputData.setStatus('ok'); outputData.setData(cmd.getSaveKey()); } function* commandSendMailMerge(cmd, outputData) { var completeParts = yield* saveParts(cmd); var isErr = false; if (completeParts) { isErr = true; var getRes = yield* docsCoServer.getCallback(cmd.getDocId()); if (getRes) { var mailMergeSend = cmd.getMailMergeSend(); mailMergeSend.setUrl(getRes.server.href); mailMergeSend.setBaseUrl(getRes.baseUrl); //меняем JsonKey и SaveKey, новый key нужет потому что за одну конвертацию делается часть, а json нужен всегда mailMergeSend.setJsonKey(cmd.getSaveKey()); yield* addRandomKeyTaskCmd(cmd); var queueData = getSaveTask(cmd); yield* docsCoServer.addTask(queueData, constants.QUEUE_PRIORITY_LOW); isErr = false; } } if (isErr) { outputData.setStatus('err'); outputData.setData(constants.UNKNOWN); } else { outputData.setStatus('ok'); outputData.setData(cmd.getSaveKey()); } } function* commandSfct(cmd, outputData) { yield* addRandomKeyTaskCmd(cmd); var queueData = getSaveTask(cmd); queueData.setFromChanges(true); yield* docsCoServer.addTask(queueData, constants.QUEUE_PRIORITY_LOW); outputData.setStatus('ok'); } function* commandImgurls(conn, cmd, outputData) { var supportedFormats; var urls; if ('imgurl' == cmd.getCommand()) { urls = [cmd.getData()]; supportedFormats = cfgTypesUpload || 'jpg'; } else { urls = cmd.getData(); supportedFormats = cfgTypesCopy || 'jpg'; } //todo Promise.all() var imageCount = 0; var outputUrls = []; for (var i = 0; i < urls.length; ++i) { var url = urls[i]; var data = undefined; if (url.startsWith('data:')) { var delimiterIndex = url.indexOf(','); if (-1 != delimiterIndex && (url.length - (delimiterIndex + 1)) * 0.75 <= cfgImageSize) { data = new Buffer(url.substring(delimiterIndex + 1), 'base64'); } } else { //todo data = yield* utils.downloadUrl(url, undefined, cfgImageSize); } var outputUrl = {url: null, path: null}; if (data) { var format = formatChecker.getFileFormat(data); var formatStr = formatChecker.getStringFromFormat(format); if (-1 !== supportedFormats.indexOf(formatStr)) { var userid = cmd.getUserId(); var imageIndex = cmd.getSaveIndex() + imageCount; imageCount++; var strLocalPath = 'media/' + utils.crc32(userid).toString(16) + '_image' + imageIndex + '.' + formatStr; var strPath = cmd.getDocId() + '/' + strLocalPath; yield storage.putObject(strPath, data, data.length); var imgUrl = yield storage.getSignedUrl(conn.baseUrl, strPath); outputUrl = {url: imgUrl, path: strLocalPath}; } } outputUrls.push(outputUrl); } outputData.setStatus('ok'); outputData.setData(outputUrls); } function* commandSaveFromOrigin(conn, cmd) { yield* addRandomKeyTaskCmd(cmd); cmd.setOutputFormat(constants.AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF); cmd.setUserConnectionId(conn.user.id); var queueData = getSaveTask(cmd); queueData.setFromOrigin(true); yield* docsCoServer.addTask(queueData, constants.QUEUE_PRIORITY_LOW); } function commandGetSettings(cmd, outputData) { //todo license outputData.setStatus('ok'); outputData.setData(new OutputSettingsData(cmd.getFormat())); } function* commandSfcCallback(cmd) { logger.debug('Start commandSfcCallback docId = %s', cmd.getDocId()); var docId = cmd.getDocId(); var saveKey = cmd.getSaveKey(); var statusInfo = cmd.getStatusInfo(); var getRes = yield* docsCoServer.getCallback(docId); if (getRes) { logger.debug('commandSfcCallback docId = %s callback = %s', docId, getRes.server.href); var outputSfc = new OutputSfcData(); outputSfc.setKey(docId); if (cmd.getUserId()) { outputSfc.setUsers([cmd.getUserId()]); } if (constants.NO_ERROR != statusInfo && constants.CONVERT_CORRUPTED != statusInfo) { outputSfc.setStatus(docsCoServer.c_oAscServerStatus.Corrupted); } else { try { var data = yield storage.getObject(saveKey + '/changesHistory.json'); outputSfc.setChangeHistory(data.toString('utf-8')); outputSfc.setUrl(yield storage.getSignedUrl(getRes.baseUrl, saveKey + '/' + cmd.getTitle())); outputSfc.setChangeUrl(yield storage.getSignedUrl(getRes.baseUrl, saveKey + '/changes.zip')); } catch (e) { logger.error('error commandSfcCallback: docId = %s\r\n%s', docId, e.stack); } if (outputSfc.getUrl() && outputSfc.getUsers().length > 0) { outputSfc.setStatus(docsCoServer.c_oAscServerStatus.MustSave); } else { outputSfc.setStatus(docsCoServer.c_oAscServerStatus.Corrupted); } } //if anybody in document stop save var hasEditors = yield* docsCoServer.hasEditors(docId); logger.debug('commandSfcCallback docId = %s hasEditors = %d', docId, hasEditors); if (!hasEditors) { yield docsCoServer.sendServerRequestPromise(getRes.server, JSON.stringify(outputSfc)); yield* docsCoServer.deleteCallback(docId); } } logger.debug('End commandSfcCallback docId = %s', cmd.getDocId()); } function* commandSendMMCallback(cmd) { logger.debug('Start commandSendMMCallback docId = %s', cmd.getDocId()); var docId = cmd.getDocId(); var saveKey = cmd.getSaveKey(); var statusInfo = cmd.getStatusInfo(); var outputSfc = new OutputSfcData(); outputSfc.setKey(docId); if (constants.NO_ERROR == statusInfo) { outputSfc.setStatus(docsCoServer.c_oAscServerStatus.MailMerge); } else { outputSfc.setStatus(docsCoServer.c_oAscServerStatus.Corrupted); } var mailMergeSendData = cmd.getMailMergeSend(); var outputMailMerge = new OutputMailMerge(mailMergeSendData); outputSfc.setMailMerge(outputMailMerge); outputSfc.setUsers([mailMergeSendData.getUserId()]); var data = yield storage.getObject(saveKey + '/' + cmd.getTitle()); var xml = data.toString('utf8'); var files = xml.match(/[< ]file.*?\/>/g); var recordRemain = (mailMergeSendData.getRecordTo() - mailMergeSendData.getRecordFrom() + 1); var recordIndexStart = mailMergeSendData.getRecordCount() - recordRemain; for (var i = 0; i < files.length; ++i) { var file = files[i]; var fieldRes = /field=["'](.*?)["']/.exec(file); outputMailMerge.setTo(fieldRes[1]); outputMailMerge.setRecordIndex(recordIndexStart + i); var pathRes = /path=["'](.*?)["']/.exec(file); var url = yield storage.getSignedUrl(mailMergeSendData.getBaseUrl(), saveKey + '/' + pathRes[1]); outputSfc.setUrl(url); var server = docsCoServer.parseUrl(mailMergeSendData.getUrl()); yield docsCoServer.sendServerRequestPromise(server, JSON.stringify(outputSfc)); } var newRecordFrom = mailMergeSendData.getRecordFrom() + Math.max(files.length, 1); if (newRecordFrom <= mailMergeSendData.getRecordTo()) { mailMergeSendData.setRecordFrom(newRecordFrom); yield* addRandomKeyTaskCmd(cmd); var queueData = getSaveTask(cmd); yield* docsCoServer.addTask(queueData, constants.QUEUE_PRIORITY_LOW); } else { logger.debug('End MailMerge docId = %s', cmd.getDocId()); } logger.debug('End commandSendMMCallback docId = %s', cmd.getDocId()); } exports.openDocument = function(conn, input) { utils.spawn(function* () { var outputData; try { var cmd = new commonDefines.InputCommand(input.message); logger.debug('Start command %s', JSON.stringify(cmd)); outputData = new OutputData(cmd.getCommand()); switch (cmd.getCommand()) { case 'open': yield* commandOpen(conn, cmd, outputData); break; case 'reopen': yield* commandReopen(cmd); break; case 'savefromorigin': yield* commandSaveFromOrigin(conn, cmd); break; case 'imgurl': case 'imgurls': yield* commandImgurls(conn, cmd, outputData); break; case 'getsettings': commandGetSettings(cmd, outputData); break; default: outputData.setStatus('err'); outputData.setData(constants.UNKNOWN); break; } } catch (e) { logger.error('error openDocument: docId = %s type = %s\r\n%s', conn ? conn.docId : 'null', (input && input.type) ? input.type : 'null', e.stack); if (!outputData) { outputData = new OutputData(); } outputData.setStatus('err'); outputData.setData(constants.UNKNOWN); } finally { if (outputData && outputData.getStatus()) { logger.debug('Response command %s', JSON.stringify(outputData)); docsCoServer.sendData(conn, new OutputDataWrap('documentOpen', outputData)); } logger.debug('End command'); } }); }; exports.downloadAs = function(req, res) { utils.spawn(function* () { try { logger.debug('Start downloadAs request'); var strCmd = req.query['cmd']; var cmd = new commonDefines.InputCommand(JSON.parse(strCmd)); logger.debug('downloadAs cmd: %s', strCmd); cmd.setData(req.body); var outputData = new OutputData(cmd.getCommand()); switch (cmd.getCommand()) { case 'save': yield* commandSave(cmd, outputData); break; case 'sendmm': yield* commandSendMailMerge(cmd, outputData); break; case 'sfct': yield* commandSfct(cmd, outputData); break; default: outputData.setStatus('err'); outputData.setData(constants.UNKNOWN); break; } var strRes = JSON.stringify(outputData); res.send(strRes); logger.debug('End downloadAs request: %s', strRes); } catch (e) { logger.error('error downloadAs:\r\n%s', e.stack); res.sendStatus(400); } }); }; exports.saveFromChanges = function(docId, optFormat) { utils.spawn(function* () { try { logger.debug('Start saveFromChanges docId = %s', docId); if (null == optFormat) { optFormat = constants.AVS_OFFICESTUDIO_FILE_OTHER_TEAMLAB_INNER; } var cmd = new commonDefines.InputCommand(); cmd.setCommand('sfc'); cmd.setDocId(docId); cmd.setOutputFormat(optFormat); yield* addRandomKeyTaskCmd(cmd); var queueData = getSaveTask(cmd); queueData.setFromChanges(true); yield* docsCoServer.addTask(queueData, constants.QUEUE_PRIORITY_NORMAL); logger.debug('addTask saveFromChanges docId = %s', docId); } catch (e) { logger.error('error saveFromChanges: docId = %s\r\n%s', docId, e.stack); } }); }; exports.receiveTask = function(data, dataRaw) { utils.spawn(function* () { try { var task = new commonDefines.TaskQueueData(JSON.parse(data)); if (task) { var cmd = task.getCmd(); logger.debug('Start receiveTask command %s', JSON.stringify(cmd)); var updateTask = getUpdateResponse(cmd); var updateRes = yield taskResult.update(updateTask); if (updateRes.affectedRows > 0) { var outputData = new OutputData(cmd.getCommand()); var command = cmd.getCommand(); var additionalOutput = {needUrlKey: null, needUrlMethod: null}; if ('open' == command || 'reopen' == command) { yield* getOutputData(cmd, outputData, cmd.getDocId(), updateTask.status, updateTask.statusInfo, null, additionalOutput); } else if ('save' == command || 'savefromorigin' == command || 'sfct' == command) { yield* getOutputData(cmd, outputData, cmd.getSaveKey(), updateTask.status, updateTask.statusInfo, null, additionalOutput); } else if ('sfc' == command) { yield* commandSfcCallback(cmd); } else if ('sendmm' == command) { yield* commandSendMMCallback(cmd); } else if ('conv' == command) { //nothing } if (outputData.getStatus()) { logger.debug('send receiveTask %s', JSON.stringify(outputData)); var output = new OutputDataWrap('documentOpen', outputData); yield* docsCoServer.publish({ type: docsCoServer.PublishType.receiveTask, cmd: cmd, output: output, needUrlKey: additionalOutput.needUrlKey, needUrlMethod: additionalOutput.needUrlMethod }); } } yield* docsCoServer.removeResponse(dataRaw); logger.debug('End receiveTask command %s', JSON.stringify(cmd)); } } catch (err) { logger.error(err); } }); }; exports.OutputDataWrap = OutputDataWrap; exports.OutputData = OutputData; \ No newline at end of file +var sqlBase = require('./baseConnector'); var docsCoServer = require('./DocsCoServer'); var taskResult = require('./taskresult'); var logger = require('./../../Common/sources/logger'); var utils = require('./../../Common/sources/utils'); var constants = require('./../../Common/sources/constants'); var commonDefines = require('./../../Common/sources/commondefines'); var storage = require('./../../Common/sources/storage-base'); var formatChecker = require('./../../Common/sources/formatchecker'); var config_server = require('config').get('services.CoAuthoring.server'); var config_utils = require('config').get('services.CoAuthoring.utils'); var cfgAutosaveEnable = config_server.get('editor.settings.autosave.enable1'); var cfgAutosaveMininterval = config_server.get('editor.settings.autosave.mininterval1'); var cfgCoauthoringUrl = config_server.get('editor.settings.coauthoring.url'); var cfgSpellcheckerUrl = config_server.get('editor.settings.spellchecker.url'); var cfgAnalyticsEnable = config_server.get('editor.settings.analytics.enable'); var cfgActiveconnectionsTrackingInterval = config_server.get('license.activeconnections.tracking.interval'); var cfgReaderformats = config_server.get('editor.settings.readerformats'); var cfgEditorformats = config_server.get('editor.settings.editorformats'); var cfgViewerformats = config_server.get('editor.settings.viewerformats'); var cfgTypesUpload = config_utils.get('limits.image.types.upload'); var cfgTypesCopy = config_utils.get('limits.image.types.copy'); var cfgImageSize = config_server.get('limits.image.size'); var SAVE_TYPE_PART_START = 0; var SAVE_TYPE_PART = 1; var SAVE_TYPE_COMPLETE = 2; var SAVE_TYPE_COMPLETE_ALL = 3; function OutputDataWrap(type, data) { this['type'] = type; this['data'] = data; } OutputDataWrap.prototype = { fromObject: function(data) { this['type'] = data['type']; this['data'] = new OutputData(); this['data'].fromObject(data['data']); }, getType: function() { return this['type']; }, setType: function(data) { this['type'] = data; }, getData: function() { return this['data']; }, setData: function(data) { this['data'] = data; } }; function OutputData(type) { this['type'] = type; this['status'] = undefined; this['data'] = undefined; } OutputData.prototype = { fromObject: function(data) { this['type'] = data['type']; this['status'] = data['status']; this['data'] = data['data']; }, getType: function() { return this['type']; }, setType: function(data) { this['type'] = data; }, getStatus: function() { return this['status']; }, setStatus: function(data) { this['status'] = data; }, getData: function() { return this['data']; }, setData: function(data) { this['data'] = data; } }; function OutputSettingsData(rights, format, trackingInfo) { this['canEdit'] = true; this['canDownload'] = true; this['canCoAuthoring'] = true; this['canReaderMode'] = true; this['canAd'] = true; this['canBranding'] = true; this['isAutosaveEnable'] = cfgAutosaveEnable || true; this['AutosaveMinInterval'] = cfgAutosaveMininterval || 300; this['g_cAscCoAuthoringUrl'] = cfgCoauthoringUrl || ''; //так имена переменных написаны в JS this['g_cAscSpellCheckUrl'] = cfgSpellcheckerUrl || ''; //чтобы не светить лишние имена здесь используются такие же. this['isAnalyticsEnable'] = cfgAnalyticsEnable || false; this['trackingInfo'] = undefined; this['TrackingInterval'] = cfgActiveconnectionsTrackingInterval || 300; if (format) { format = format.toLowerCase(); var readerFormats = cfgReaderformats || ''; var readerFormatsArray = readerFormats.split(/[|,;]/); this['canReaderMode'] = -1 != readerFormatsArray.indexOf(format); var editorformats = cfgEditorformats || ''; var editorformatsArray = editorformats.split(/[|,;]/); this['canEdit'] = -1 != editorformatsArray.indexOf(format); var viewerformats = cfgViewerformats || ''; var viewerformatsArray = viewerformats.split(/[|,;]/); this['canDownload'] = -1 != viewerformatsArray.indexOf(format); } if (rights) { //todo } if (trackingInfo) { //todo } } function OutputSfcData() { this['key'] = undefined; this['status'] = undefined; this['url'] = undefined; this['changesurl'] = undefined; this['changeshistory'] = undefined; this['users'] = []; this['mailMerge'] = undefined; } OutputSfcData.prototype = { getKey: function() { return this['key']; }, setKey: function(data) { return this['key'] = data; }, getStatus: function() { return this['status']; }, setStatus: function(data) { return this['status'] = data; }, getUrl: function() { return this['url']; }, setUrl: function(data) { return this['url'] = data; }, getChangeUrl: function() { return this['changesurl']; }, setChangeUrl: function(data) { return this['changesurl'] = data; }, getChangeHistory: function() { return this['changeshistory']; }, setChangeHistory: function(data) { return this['changeshistory'] = data; }, getUsers: function() { return this['users']; }, setUsers: function(data) { return this['users'] = data; }, getMailMerge: function() { return this['mailMerge']; }, setMailMerge: function(data) { return this['mailMerge'] = data; } }; function OutputMailMerge(mailMergeSendData) { if (mailMergeSendData) { this['from'] = mailMergeSendData.getFrom(); this['message'] = mailMergeSendData.getMessage(); this['subject'] = mailMergeSendData.getSubject(); this['title'] = mailMergeSendData.getFileName(); var mailFormat = mailMergeSendData.getMailFormat(); switch (mailFormat) { case constants.AVS_OFFICESTUDIO_FILE_OTHER_HTMLZIP : this['type'] = 0; break; case constants.AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX : this['type'] = 1; break; case constants.AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF : this['type'] = 2; break; default : this['type'] = 0; break; } this['recordCount'] = mailMergeSendData.getRecordCount(); this['to'] = null; this['recordIndex'] = null; } else { this['from'] = null; this['message'] = null; this['subject'] = null; this['title'] = null; this['to'] = null; this['type'] = null; this['recordCount'] = null; this['recordIndex'] = null; } } OutputMailMerge.prototype = { getRecordIndex: function() { return this['recordIndex']; }, setRecordIndex: function(data) { return this['recordIndex'] = data; }, getTo: function() { return this['to']; }, setTo: function(data) { return this['to'] = data; } }; function getInsertStatisticString(affiliateId, filename, tag) { var dateNow = sqlBase.getDateTime(new Date()); var commandArg = [affiliateId, filename, dateNow, tag]; var commandArgEsc = commandArg.map(function(curVal) { return sqlBase.baseConnector.sqlEscape(curVal) }); return 'INSERT INTO file_statistic2 (fsc_affiliate, fsc_filename, fsc_time, fsc_tag) ' + 'VALUES (' + commandArgEsc.join(', ') + ');'; } function insertStatistic(affiliateId, filename, tag) { return new Promise(function(resolve, reject) { var sqlCommand = getInsertStatisticString(affiliateId, filename, tag); sqlBase.baseConnector.sqlQuery(sqlCommand, function(error, result) { if (error) { reject(error); } else { resolve(result); } }); }); } function* getOutputData(cmd, outputData, key, status, statusInfo, optConn, optAdditionalOutput) { switch (status) { case taskResult.FileStatus.Ok: //todo affilate var tag; var affiliateId = 'affiliateId'; switch (cmd.getEditorId()) { // case (int)LicenseInfo.EditorType.Spreadsheet: tag = 'open_sheet'; break; // case (int)LicenseInfo.EditorType.Presentation: tag = 'open_presentation'; break; default: tag = 'open_word'; break; } yield insertStatistic(affiliateId, cmd.getDocId(), tag); outputData.setStatus('ok'); if (optConn) { outputData.setData(yield storage.getSignedUrls(optConn.baseUrl, key)); } else if (optAdditionalOutput) { optAdditionalOutput.needUrlKey = key; optAdditionalOutput.needUrlMethod = 0; } break; case taskResult.FileStatus.NeedParams: outputData.setStatus('needparams'); var settingsPath = key + '/' + 'settings.json'; if (optConn) { outputData.setData(yield storage.getSignedUrl(optConn.baseUrl, settingsPath)); } else if (optAdditionalOutput) { optAdditionalOutput.needUrlKey = settingsPath; optAdditionalOutput.needUrlMethod = 1; } break; case taskResult.FileStatus.Err: case taskResult.FileStatus.ErrToReload: outputData.setStatus('err'); outputData.setData(statusInfo); break; case taskResult.FileStatus.SaveVersion: case taskResult.FileStatus.UpdateVersion: outputData.setStatus('updateversion'); break; } } function* addRandomKeyTaskCmd(cmd) { var task = yield* taskResult.addRandomKeyTask(cmd.getDocId()); cmd.setSaveKey(task.key); } function* saveParts(cmd) { var result = false; var saveType = cmd.getSaveType(); var filename; if (SAVE_TYPE_COMPLETE_ALL === saveType) { filename = 'Editor.bin'; } else { filename = 'Editor' + (cmd.getSaveIndex() || '') + '.bin'; } if (SAVE_TYPE_PART_START === saveType || SAVE_TYPE_COMPLETE_ALL === saveType) { yield* addRandomKeyTaskCmd(cmd); } if (cmd.getUrl()) { result = true; } else { var buffer = cmd.getData(); yield storage.putObject(cmd.getSaveKey() + '/' + filename, buffer, buffer.length); //delete data to prevent serialize into json cmd.data = null; result = (SAVE_TYPE_COMPLETE_ALL === saveType || SAVE_TYPE_COMPLETE === saveType); } return result; } function getSaveTask(cmd) { cmd.setData(null); var queueData = new commonDefines.TaskQueueData(); queueData.setCmd(cmd); queueData.setToFile('output.' + formatChecker.getStringFromFormat(cmd.getOutputFormat())); //todo paid //if (cmd.vkey) { // bool // bPaid; // Signature.getVKeyParams(cmd.vkey, out bPaid); // oTaskQueueData.m_bPaid = bPaid; //} return queueData; } function getUpdateResponse(cmd) { var updateTask = new taskResult.TaskResultData(); updateTask.key = cmd.getSaveKey() ? cmd.getSaveKey() : cmd.getDocId(); var statusInfo = cmd.getStatusInfo(); if (constants.NO_ERROR == statusInfo) { updateTask.status = taskResult.FileStatus.Ok; } else if (constants.CONVERT_DOWNLOAD == statusInfo) { updateTask.status = taskResult.FileStatus.ErrToReload; } else { updateTask.status = taskResult.FileStatus.Err; } updateTask.statusInfo = statusInfo; if (cmd.getTitle()) { updateTask.title = cmd.getTitle(); } return updateTask; } function* commandOpen(conn, cmd, outputData) { var task = new taskResult.TaskResultData(); task.key = cmd.getDocId(); task.format = cmd.getFormat(); task.status = taskResult.FileStatus.WaitQueue; task.statusInfo = constants.NO_ERROR; task.title = cmd.getTitle(); var upsertRes = yield taskResult.upsert(task); //var bCreate = (upsertRes.affectedRows == 1); var bExist = (upsertRes.affectedRows > 1); if (bExist) { var selectRes = yield taskResult.select(task); if (selectRes.length > 0) { var row = selectRes[0]; yield* getOutputData(cmd, outputData, cmd.getDocId(), row.tr_status, row.tr_status_info, conn); } } else { //add task cmd.setOutputFormat(constants.AVS_OFFICESTUDIO_FILE_CANVAS); cmd.setEmbeddedFonts(false); var dataQueue = new commonDefines.TaskQueueData(); dataQueue.setCmd(cmd); dataQueue.setToFile('Editor.bin'); yield* docsCoServer.addTask(dataQueue, constants.QUEUE_PRIORITY_HIGH); } } function* commandReopen(cmd) { var task = new taskResult.TaskResultData(); task.status = taskResult.FileStatus.WaitQueue; task.statusInfo = constants.NO_ERROR; var upsertRes = yield taskResult.update(task); if (upsertRes.affectedRows > 1) { //add task cmd.setSaveKey(cmd.getDocId()); cmd.setOutputFormat(constants.AVS_OFFICESTUDIO_FILE_CANVAS); cmd.setEmbeddedFonts(false); var dataQueue = new commonDefines.TaskQueueData(); dataQueue.setCmd(cmd); dataQueue.setToFile('Editor.bin'); dataQueue.setFromSettings(true); yield* docsCoServer.addTask(dataQueue, constants.QUEUE_PRIORITY_HIGH); } } function* commandSave(cmd, outputData) { var completeParts = yield* saveParts(cmd); if (completeParts) { var queueData = getSaveTask(cmd); yield* docsCoServer.addTask(queueData, constants.QUEUE_PRIORITY_LOW); } outputData.setStatus('ok'); outputData.setData(cmd.getSaveKey()); } function* commandSendMailMerge(cmd, outputData) { var completeParts = yield* saveParts(cmd); var isErr = false; if (completeParts) { isErr = true; var getRes = yield* docsCoServer.getCallback(cmd.getDocId()); if (getRes) { var mailMergeSend = cmd.getMailMergeSend(); mailMergeSend.setUrl(getRes.server.href); mailMergeSend.setBaseUrl(getRes.baseUrl); //меняем JsonKey и SaveKey, новый key нужет потому что за одну конвертацию делается часть, а json нужен всегда mailMergeSend.setJsonKey(cmd.getSaveKey()); yield* addRandomKeyTaskCmd(cmd); var queueData = getSaveTask(cmd); yield* docsCoServer.addTask(queueData, constants.QUEUE_PRIORITY_LOW); isErr = false; } } if (isErr) { outputData.setStatus('err'); outputData.setData(constants.UNKNOWN); } else { outputData.setStatus('ok'); outputData.setData(cmd.getSaveKey()); } } function* commandSfct(cmd, outputData) { yield* addRandomKeyTaskCmd(cmd); var queueData = getSaveTask(cmd); queueData.setFromChanges(true); yield* docsCoServer.addTask(queueData, constants.QUEUE_PRIORITY_LOW); outputData.setStatus('ok'); } function* commandImgurls(conn, cmd, outputData) { var supportedFormats; var urls; if ('imgurl' == cmd.getCommand()) { urls = [cmd.getData()]; supportedFormats = cfgTypesUpload || 'jpg'; } else { urls = cmd.getData(); supportedFormats = cfgTypesCopy || 'jpg'; } //todo Promise.all() var imageCount = 0; var outputUrls = []; for (var i = 0; i < urls.length; ++i) { var url = urls[i]; var data = undefined; if (url.startsWith('data:')) { var delimiterIndex = url.indexOf(','); if (-1 != delimiterIndex && (url.length - (delimiterIndex + 1)) * 0.75 <= cfgImageSize) { data = new Buffer(url.substring(delimiterIndex + 1), 'base64'); } } else { //todo data = yield* utils.downloadUrl(url, undefined, cfgImageSize); } var outputUrl = {url: null, path: null}; if (data) { var format = formatChecker.getFileFormat(data); var formatStr = formatChecker.getStringFromFormat(format); if (-1 !== supportedFormats.indexOf(formatStr)) { var userid = cmd.getUserId(); var imageIndex = cmd.getSaveIndex() + imageCount; imageCount++; var strLocalPath = 'media/' + utils.crc32(userid).toString(16) + '_image' + imageIndex + '.' + formatStr; var strPath = cmd.getDocId() + '/' + strLocalPath; yield storage.putObject(strPath, data, data.length); var imgUrl = yield storage.getSignedUrl(conn.baseUrl, strPath); outputUrl = {url: imgUrl, path: strLocalPath}; } } outputUrls.push(outputUrl); } outputData.setStatus('ok'); outputData.setData(outputUrls); } function* commandSaveFromOrigin(conn, cmd) { yield* addRandomKeyTaskCmd(cmd); cmd.setOutputFormat(constants.AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF); cmd.setUserConnectionId(conn.user.id); var queueData = getSaveTask(cmd); queueData.setFromOrigin(true); yield* docsCoServer.addTask(queueData, constants.QUEUE_PRIORITY_LOW); } function commandGetSettings(cmd, outputData) { //todo license outputData.setStatus('ok'); outputData.setData(new OutputSettingsData(cmd.getFormat())); } function* commandSfcCallback(cmd) { logger.debug('Start commandSfcCallback docId = %s', cmd.getDocId()); var docId = cmd.getDocId(); var saveKey = cmd.getSaveKey(); var statusInfo = cmd.getStatusInfo(); var getRes = yield* docsCoServer.getCallback(docId); if (getRes) { logger.debug('commandSfcCallback docId = %s callback = %s', docId, getRes.server.href); var outputSfc = new OutputSfcData(); outputSfc.setKey(docId); if (cmd.getUserId()) { outputSfc.setUsers([cmd.getUserId()]); } if (constants.NO_ERROR != statusInfo && constants.CONVERT_CORRUPTED != statusInfo) { outputSfc.setStatus(docsCoServer.c_oAscServerStatus.Corrupted); } else { try { var data = yield storage.getObject(saveKey + '/changesHistory.json'); outputSfc.setChangeHistory(data.toString('utf-8')); outputSfc.setUrl(yield storage.getSignedUrl(getRes.baseUrl, saveKey + '/' + cmd.getTitle())); outputSfc.setChangeUrl(yield storage.getSignedUrl(getRes.baseUrl, saveKey + '/changes.zip')); } catch (e) { logger.error('error commandSfcCallback: docId = %s\r\n%s', docId, e.stack); } if (outputSfc.getUrl() && outputSfc.getUsers().length > 0) { outputSfc.setStatus(docsCoServer.c_oAscServerStatus.MustSave); } else { outputSfc.setStatus(docsCoServer.c_oAscServerStatus.Corrupted); } } //if anybody in document stop save var hasEditors = yield* docsCoServer.hasEditors(docId); logger.debug('commandSfcCallback docId = %s hasEditors = %d', docId, hasEditors); if (!hasEditors) { yield docsCoServer.sendServerRequestPromise(getRes.server, JSON.stringify(outputSfc)); yield* docsCoServer.deleteCallback(docId); } } logger.debug('End commandSfcCallback docId = %s', cmd.getDocId()); } function* commandSendMMCallback(cmd) { logger.debug('Start commandSendMMCallback docId = %s', cmd.getDocId()); var docId = cmd.getDocId(); var saveKey = cmd.getSaveKey(); var statusInfo = cmd.getStatusInfo(); var outputSfc = new OutputSfcData(); outputSfc.setKey(docId); if (constants.NO_ERROR == statusInfo) { outputSfc.setStatus(docsCoServer.c_oAscServerStatus.MailMerge); } else { outputSfc.setStatus(docsCoServer.c_oAscServerStatus.Corrupted); } var mailMergeSendData = cmd.getMailMergeSend(); var outputMailMerge = new OutputMailMerge(mailMergeSendData); outputSfc.setMailMerge(outputMailMerge); outputSfc.setUsers([mailMergeSendData.getUserId()]); var data = yield storage.getObject(saveKey + '/' + cmd.getTitle()); var xml = data.toString('utf8'); var files = xml.match(/[< ]file.*?\/>/g); var recordRemain = (mailMergeSendData.getRecordTo() - mailMergeSendData.getRecordFrom() + 1); var recordIndexStart = mailMergeSendData.getRecordCount() - recordRemain; for (var i = 0; i < files.length; ++i) { var file = files[i]; var fieldRes = /field=["'](.*?)["']/.exec(file); outputMailMerge.setTo(fieldRes[1]); outputMailMerge.setRecordIndex(recordIndexStart + i); var pathRes = /path=["'](.*?)["']/.exec(file); var url = yield storage.getSignedUrl(mailMergeSendData.getBaseUrl(), saveKey + '/' + pathRes[1]); outputSfc.setUrl(url); var server = docsCoServer.parseUrl(mailMergeSendData.getUrl()); yield docsCoServer.sendServerRequestPromise(server, JSON.stringify(outputSfc)); } var newRecordFrom = mailMergeSendData.getRecordFrom() + Math.max(files.length, 1); if (newRecordFrom <= mailMergeSendData.getRecordTo()) { mailMergeSendData.setRecordFrom(newRecordFrom); yield* addRandomKeyTaskCmd(cmd); var queueData = getSaveTask(cmd); yield* docsCoServer.addTask(queueData, constants.QUEUE_PRIORITY_LOW); } else { logger.debug('End MailMerge docId = %s', cmd.getDocId()); } logger.debug('End commandSendMMCallback docId = %s', cmd.getDocId()); } exports.openDocument = function(conn, input) { utils.spawn(function* () { var outputData; try { var cmd = new commonDefines.InputCommand(input.message); logger.debug('Start command %s', JSON.stringify(cmd)); outputData = new OutputData(cmd.getCommand()); switch (cmd.getCommand()) { case 'open': yield* commandOpen(conn, cmd, outputData); break; case 'reopen': yield* commandReopen(cmd); break; case 'savefromorigin': yield* commandSaveFromOrigin(conn, cmd); break; case 'imgurl': case 'imgurls': yield* commandImgurls(conn, cmd, outputData); break; case 'getsettings': commandGetSettings(cmd, outputData); break; default: outputData.setStatus('err'); outputData.setData(constants.UNKNOWN); break; } } catch (e) { logger.error('error openDocument: docId = %s type = %s\r\n%s', conn ? conn.docId : 'null', (input && input.type) ? input.type : 'null', e.stack); if (!outputData) { outputData = new OutputData(); } outputData.setStatus('err'); outputData.setData(constants.UNKNOWN); } finally { if (outputData && outputData.getStatus()) { logger.debug('Response command %s', JSON.stringify(outputData)); docsCoServer.sendData(conn, new OutputDataWrap('documentOpen', outputData)); } logger.debug('End command'); } }); }; exports.downloadAs = function(req, res) { utils.spawn(function* () { try { logger.debug('Start downloadAs request'); var strCmd = req.query['cmd']; var cmd = new commonDefines.InputCommand(JSON.parse(strCmd)); logger.debug('downloadAs cmd: %s', strCmd); cmd.setData(req.body); var outputData = new OutputData(cmd.getCommand()); switch (cmd.getCommand()) { case 'save': yield* commandSave(cmd, outputData); break; case 'sendmm': yield* commandSendMailMerge(cmd, outputData); break; case 'sfct': yield* commandSfct(cmd, outputData); break; default: outputData.setStatus('err'); outputData.setData(constants.UNKNOWN); break; } var strRes = JSON.stringify(outputData); res.send(strRes); logger.debug('End downloadAs request: %s', strRes); } catch (e) { logger.error('error downloadAs:\r\n%s', e.stack); res.sendStatus(400); } }); }; exports.saveFromChanges = function(docId, optFormat) { utils.spawn(function* () { try { logger.debug('Start saveFromChanges docId = %s', docId); if (null == optFormat) { optFormat = constants.AVS_OFFICESTUDIO_FILE_OTHER_TEAMLAB_INNER; } var cmd = new commonDefines.InputCommand(); cmd.setCommand('sfc'); cmd.setDocId(docId); cmd.setOutputFormat(optFormat); yield* addRandomKeyTaskCmd(cmd); var queueData = getSaveTask(cmd); queueData.setFromChanges(true); yield* docsCoServer.addTask(queueData, constants.QUEUE_PRIORITY_NORMAL); logger.debug('addTask saveFromChanges docId = %s', docId); } catch (e) { logger.error('error saveFromChanges: docId = %s\r\n%s', docId, e.stack); } }); }; exports.receiveTask = function(data, dataRaw) { utils.spawn(function* () { try { var task = new commonDefines.TaskQueueData(JSON.parse(data)); if (task) { var cmd = task.getCmd(); logger.debug('Start receiveTask command %s', JSON.stringify(cmd)); var updateTask = getUpdateResponse(cmd); var updateRes = yield taskResult.update(updateTask); if (updateRes.affectedRows > 0) { var outputData = new OutputData(cmd.getCommand()); var command = cmd.getCommand(); var additionalOutput = {needUrlKey: null, needUrlMethod: null}; if ('open' == command || 'reopen' == command) { yield* getOutputData(cmd, outputData, cmd.getDocId(), updateTask.status, updateTask.statusInfo, null, additionalOutput); } else if ('save' == command || 'savefromorigin' == command || 'sfct' == command) { yield* getOutputData(cmd, outputData, cmd.getSaveKey(), updateTask.status, updateTask.statusInfo, null, additionalOutput); } else if ('sfc' == command) { yield* commandSfcCallback(cmd); } else if ('sendmm' == command) { yield* commandSendMMCallback(cmd); } else if ('conv' == command) { //nothing } if (outputData.getStatus()) { logger.debug('send receiveTask %s', JSON.stringify(outputData)); var output = new OutputDataWrap('documentOpen', outputData); yield* docsCoServer.publish({ type: docsCoServer.PublishType.receiveTask, cmd: cmd, output: output, needUrlKey: additionalOutput.needUrlKey, needUrlMethod: additionalOutput.needUrlMethod }); } } yield* docsCoServer.removeResponse(dataRaw); logger.debug('End receiveTask command %s', JSON.stringify(cmd)); } } catch (err) { logger.error(err); } }); }; exports.OutputDataWrap = OutputDataWrap; exports.OutputData = OutputData; \ No newline at end of file diff --git a/CoAuthoring/sources/converterservice.js b/CoAuthoring/sources/converterservice.js index c50d8661..45c1066f 100644 --- a/CoAuthoring/sources/converterservice.js +++ b/CoAuthoring/sources/converterservice.js @@ -6,7 +6,7 @@ var commonDefines = require('./../../Common/sources/commondefines'); var docsCoServer = require('./DocsCoServer'); var storage = require('./../../Common/sources/storage-base'); var formatChecker = require('./../../Common/sources/formatchecker'); -var config = require('./config.json'); +//var config = require('./config.json'); //todo var CONVERT_TIMEOUT = 6 * 60 * 1000; diff --git a/CoAuthoring/sources/fileuploaderservice.js b/CoAuthoring/sources/fileuploaderservice.js index b29c7cd4..73b4f7e1 100644 --- a/CoAuthoring/sources/fileuploaderservice.js +++ b/CoAuthoring/sources/fileuploaderservice.js @@ -4,9 +4,9 @@ var utils = require('./../../Common/sources/utils'); var constants = require('./../../Common/sources/constants'); var storageBase = require('./../../Common/sources/storage-base'); var logger = require('./../../Common/sources/logger'); -var config = require('./config.json'); +var config = require('config').get('services.CoAuthoring.server'); -var cfgImageSize = config['server']['limits.image.size']; +var cfgImageSize = config.get('limits.image.size'); exports.uploadTempFile = function(req, res) { utils.spawn(function* () { diff --git a/CoAuthoring/sources/mySqlBaseConnector.js b/CoAuthoring/sources/mySqlBaseConnector.js index 2ca92953..980baa95 100644 --- a/CoAuthoring/sources/mySqlBaseConnector.js +++ b/CoAuthoring/sources/mySqlBaseConnector.js @@ -1 +1 @@ -var mysql = require('mysql'); var config = require('./config.json'); var configSql = config['sql']; var pool = mysql.createPool({ host : configSql['host'], port : configSql['dbport'], user : configSql['user'], password : configSql['pass'], database : configSql['database'], charset : configSql['charset'], timezone : '+0000' }); var logger = require('./../../Common/sources/logger'); exports.sqlQuery = function (sqlCommand, callbackFunction) { pool.getConnection(function(err, connection) { if (err) { logger.error('pool.getConnection error: %s', err); if (callbackFunction) callbackFunction(err, null); return; } connection.query(sqlCommand, function (error, result) { connection.release(); if (error) { logger.error('________________________error_____________________'); logger.error('sqlQuery: %s sqlCommand: %s', error.code, sqlCommand); logger.error(error); logger.error('_____________________end_error_____________________'); } if (callbackFunction) callbackFunction(error, result); }); }); }; exports.sqlEscape = function (value) { return pool.escape(value); }; \ No newline at end of file +var mysql = require('mysql'); var configSql = require('config').get('services.CoAuthoring.sql'); var pool = mysql.createPool({ host : configSql.get('host'), port : configSql.get('dbport'), user : configSql.get('user'), password : configSql.get('pass'), database : configSql.get('database'), charset : configSql.get('charset'), timezone : '+0000' }); var logger = require('./../../Common/sources/logger'); exports.sqlQuery = function (sqlCommand, callbackFunction) { pool.getConnection(function(err, connection) { if (err) { logger.error('pool.getConnection error: %s', err); if (callbackFunction) callbackFunction(err, null); return; } connection.query(sqlCommand, function (error, result) { connection.release(); if (error) { logger.error('________________________error_____________________'); logger.error('sqlQuery: %s sqlCommand: %s', error.code, sqlCommand); logger.error(error); logger.error('_____________________end_error_____________________'); } if (callbackFunction) callbackFunction(error, result); }); }); }; exports.sqlEscape = function (value) { return pool.escape(value); }; \ No newline at end of file diff --git a/CoAuthoring/sources/postgreSqlBaseConnector.js b/CoAuthoring/sources/postgreSqlBaseConnector.js index 780ec3f3..5d9ce274 100644 --- a/CoAuthoring/sources/postgreSqlBaseConnector.js +++ b/CoAuthoring/sources/postgreSqlBaseConnector.js @@ -1,8 +1,7 @@ var pg = require('pg'); -var config = require('./config.json'); -var configSql = config['sql']; -var connectionString = 'postgres://' + configSql['user'] + ':' + configSql['pass'] + '@' + configSql['host'] + - (configSql['dbport'] ? (':' + configSql['dbport']) : '') + '/' + configSql['database']; +var configSql = require('config').get('services.CoAuthoring.sql') +var connectionString = 'postgres://' + configSql.get('user') + ':' + configSql.get('pass') + '@' + configSql.get('host') + + (configSql.get('dbport') ? (':' + configSql.get('dbport')) : '') + '/' + configSql.get('database'); var logger = require('./../../Common/sources/logger'); diff --git a/CoAuthoring/sources/pubsubRabbitMQ.js b/CoAuthoring/sources/pubsubRabbitMQ.js index f4eb748d..27f31988 100644 --- a/CoAuthoring/sources/pubsubRabbitMQ.js +++ b/CoAuthoring/sources/pubsubRabbitMQ.js @@ -1,11 +1,10 @@ 'use strict'; -var configCommon = require('./../../Common/sources/config.json'); var events = require('events'); var util = require('util'); var utils = require('./../../Common/sources/utils'); var rabbitMQCore = require('./../../Common/sources/rabbitMQCore'); -var cfgRabbitExchangePubSub = configCommon['rabbitmq']['exchangepubsub']; +var cfgRabbitExchangePubSub = require('config').get('rabbitmq.exchangepubsub'); function PubsubRabbitMQ() { this.channelPublish = null; diff --git a/CoAuthoring/sources/pubsubRedis.js b/CoAuthoring/sources/pubsubRedis.js index b0042d23..bb9afad5 100644 --- a/CoAuthoring/sources/pubsubRedis.js +++ b/CoAuthoring/sources/pubsubRedis.js @@ -1,13 +1,13 @@ 'use strict'; -var config = require('./config.json'); +var config = require('config').get('services.CoAuthoring.redis'); var events = require('events'); var util = require('util'); var logger = require('./../../Common/sources/logger'); -var redis = require(config['redis']['name']); +var redis = require(config.get('name')); -var cfgRedisPrefix = config['redis']['prefix']; -var cfgRedisHost = config['redis']['host']; -var cfgRedisPort = config['redis']['port']; +var cfgRedisPrefix = config.get('prefix'); +var cfgRedisHost = config.get('host'); +var cfgRedisPort = config.get('port'); var channelName = cfgRedisPrefix + 'pubsub'; diff --git a/CoAuthoring/sources/server.js b/CoAuthoring/sources/server.js index de6188b9..26840531 100644 --- a/CoAuthoring/sources/server.js +++ b/CoAuthoring/sources/server.js @@ -1,11 +1,11 @@ var cluster = require('cluster'); -var config = require('./config.json'); +var config = require('config').get('services.CoAuthoring'); var numCPUs = require('os').cpus().length; -process.env.NODE_ENV = config['server']['mode']; +process.env.NODE_ENV = config.get('server.mode'); var logger = require('./../../Common/sources/logger'); -var cfgWorkerPerCpu = config['server']['workerpercpu']; +var cfgWorkerPerCpu = config.get('server.workerpercpu'); var workersCount = Math.ceil(numCPUs * cfgWorkerPerCpu); if (cluster.isMaster) { @@ -37,11 +37,11 @@ if (cluster.isMaster) { logger.warn('Express server starting...'); - var configSSL = config['ssl']; + var configSSL = config.get('ssl'); if (configSSL) { - var privateKey = fs.readFileSync(configSSL['key']).toString(), - certificateKey = fs.readFileSync(configSSL['cert']).toString(), - trustedCertificate = fs.readFileSync(configSSL['ca']).toString(), + var privateKey = fs.readFileSync(configSSL.get('key')).toString(), + certificateKey = fs.readFileSync(configSSL.get('cert')).toString(), + trustedCertificate = fs.readFileSync(configSSL.get('ca')).toString(), //See detailed options format here: http://nodejs.org/api/tls.html#tls_tls_createserver_options_secureconnectionlistener options = {key: privateKey, cert: certificateKey, ca: [trustedCertificate]}; @@ -50,30 +50,30 @@ if (cluster.isMaster) { server = http.createServer(app); } - if (config['server'] && config['server']['static.content']) { - var staticContent = config['server']['static.content']; + if (config.get('server') && config.get('server.static.content')) { + var staticContent = config.get('server.static.content'); for(var i = 0; i < staticContent.length; ++i) { var staticContentElem = staticContent[i]; app.use(staticContentElem['name'], express.static(staticContentElem['path'])); } } - if (configCommon && configCommon['storage'] && configCommon['storage']['fs'] && - configCommon['storage']['fs']['folderPath']) { - var cfgBucketName = configCommon['storage']['bucketName']; - var cfgStorageFolderName = configCommon['storage']['storageFolderName']; + if (configCommon && configCommon['storage') && configCommon['storage.fs') && + configCommon['storage.fs.folderPath')) { + var cfgBucketName = configCommon['storage.bucketName'); + var cfgStorageFolderName = configCommon['storage.storageFolderName'); app.use('/' + cfgBucketName + '/' + cfgStorageFolderName, function(req, res, next) { res.setHeader("Content-Disposition", 'attachment'); next(); - }, express.static(configCommon['storage']['fs']['folderPath'])); + }, express.static(configCommon['storage.fs.folderPath'))); } // Если захочется использовать 'development' и 'production', // то с помощью app.settings.env (https://github.com/strongloop/express/issues/936) // Если нужна обработка ошибок, то теперь она такая https://github.com/expressjs/errorhandler docsCoServer.install(server, function() { - server.listen(config['server']['port'], function() { - logger.warn("Express server listening on port %d in %s mode", config['server']['port'], app.settings.env); + server.listen(config.get('server.port'), function() { + logger.warn("Express server listening on port %d in %s mode", config.get('server.port'), app.settings.env); }); app.get('/index.html', function(req, res) { @@ -92,14 +92,14 @@ if (cluster.isMaster) { res.send(result); } - app.get('/' + config['server']['fonts.route'] + 'native/:fontname', fontService.getFont); - app.get('/' + config['server']['fonts.route'] + 'js/:fontname', fontService.getFont); - app.get('/' + config['server']['fonts.route'] + 'odttf/:fontname', fontService.getFont); + app.get('/' + config.get('server.fonts.route') + 'native/:fontname', fontService.getFont); + app.get('/' + config.get('server.fonts.route') + 'js/:fontname', fontService.getFont); + app.get('/' + config.get('server.fonts.route') + 'odttf/:fontname', fontService.getFont); app.get('/ConvertService.ashx', converterService.convert); app.post('/ConvertService.ashx', converterService.convert); - var rawFileParser = bodyParser.raw({ inflate: true, limit: config['server']['limits.tempfile.upload'], type: '*/*' }); + var rawFileParser = bodyParser.raw({ inflate: true, limit: config.get('server.limits.tempfile.upload'), type: '*/*' }); app.post('/FileUploader.ashx', rawFileParser, fileUploaderService.uploadTempFile); var docIdRegExp = new RegExp("^[" + constants.DOC_ID_PATTERN + "]*$", 'i'); diff --git a/Common/sources/logger.js b/Common/sources/logger.js index 0714a1bd..5994fbf2 100644 --- a/Common/sources/logger.js +++ b/Common/sources/logger.js @@ -1,7 +1,7 @@ -var config = require('./config.json'); +var config = require('config'); var log4js = require('log4js'); -log4js.configure(config['log']); +log4js.configure(config.get('log')); var logger = log4js.getLogger('nodeJS'); diff --git a/Common/sources/rabbitMQCore.js b/Common/sources/rabbitMQCore.js index 2ffc7f5e..1537cc3f 100644 --- a/Common/sources/rabbitMQCore.js +++ b/Common/sources/rabbitMQCore.js @@ -1,15 +1,15 @@ 'use strict'; -var config = require('./config.json'); +var config = require('config'); var amqp = require('amqplib/callback_api'); -var cfgRabbitUrl = config['rabbitmq']['url']; -var cfgRabbitLogin = config['rabbitmq']['login']; -var cfgRabbitPassword = config['rabbitmq']['password']; -var cfgRabbitConnectionTimeout = config['rabbitmq']['connectionTimeout']; -var cfgRabbitAuthMechanism = config['rabbitmq']['authMechanism']; -var cfgRabbitVhost = config['rabbitmq']['vhost']; -var cfgRabbitNoDelay = config['rabbitmq']['noDelay']; -var cfgRabbitSslEnabled = config['rabbitmq']['sslenabled']; +var cfgRabbitUrl = config.get('rabbitmq.url'); +var cfgRabbitLogin = config.get('rabbitmq.login'); +var cfgRabbitPassword = config.get('rabbitmq.password'); +var cfgRabbitConnectionTimeout = config.get('rabbitmq.connectionTimeout'); +var cfgRabbitAuthMechanism = config.get('rabbitmq.authMechanism'); +var cfgRabbitVhost = config.get('rabbitmq.vhost'); +var cfgRabbitNoDelay = config.get('rabbitmq.noDelay'); +var cfgRabbitSslEnabled = config.get('rabbitmq.sslenabled'); function connetPromise() { return new Promise(function(resolve, reject) { diff --git a/Common/sources/storage-base.js b/Common/sources/storage-base.js index 04616644..28ac120f 100644 --- a/Common/sources/storage-base.js +++ b/Common/sources/storage-base.js @@ -1 +1 @@ -'use strict'; var config = require('./config.json'); var commonDefines = require('./commondefines'); var utils = require('./utils'); var logger = require('./logger'); var storage = require('./' + config['storage']['name']); function getStoragePath(strPath) { return strPath.replace(/\\/g, '/'); } exports.getObject = function(strPath) { return storage.getObject(getStoragePath(strPath)); }; exports.putObject = function(strPath, buffer, contentLength) { return storage.putObject(getStoragePath(strPath), buffer, contentLength); }; exports.listObjects = function(strPath) { return storage.listObjects(getStoragePath(strPath)).catch(function(e) { logger.error('storage.listObjects:\r\n%s', e.stack); return []; }); }; exports.deleteObject = function(strPath) { return storage.deleteObject(getStoragePath(strPath)); }; exports.deleteObjects = function(strPaths) { var StoragePaths = strPaths.map(function(curValue) { return getStoragePath(curValue); }); return storage.deleteObjects(StoragePaths); }; exports.deletePath = function(strPath) { return new Promise(function(resolve, reject) { utils.spawn(function* () { try { var list = yield exports.listObjects(getStoragePath(strPath)); yield exports.deleteObjects(list); resolve(); } catch (err) { reject(err); } }); }); }; exports.getSignedUrl = function(baseUrl, strPath, optUrlExpires) { return storage.getSignedUrl(baseUrl, getStoragePath(strPath), optUrlExpires); }; exports.getSignedUrls = function(baseUrl, strPath, optUrlExpires) { return exports.listObjects(getStoragePath(strPath)).then(function(list) { return Promise.all(list.map(function(curValue) { return exports.getSignedUrl(baseUrl, curValue, optUrlExpires); })).then(function(urls) { var outputMap = {}; for (var i = 0; i < list.length && i < urls.length; ++i) { outputMap[exports.getRelativePath(strPath, list[i])] = urls[i]; } return outputMap; }); }); }; exports.getSignedUrlsByArray = function(baseUrl, list, optPath, optUrlExpires) { return Promise.all(list.map(function(curValue) { return exports.getSignedUrl(baseUrl, curValue, optUrlExpires); })).then(function(urls) { var outputMap = {}; for (var i = 0; i < list.length && i < urls.length; ++i) { if (optPath) { outputMap[exports.getRelativePath(optPath, list[i])] = urls[i]; } else { outputMap[list[i]] = urls[i]; } } return outputMap; }); }; exports.getRelativePath = function(strBase, strPath) { return strPath.substring(strBase.length + 1); }; \ No newline at end of file +'use strict'; var config = require('config'); var commonDefines = require('./commondefines'); var utils = require('./utils'); var logger = require('./logger'); var storage = require('./' + config.get('storage.name')); function getStoragePath(strPath) { return strPath.replace(/\\/g, '/'); } exports.getObject = function(strPath) { return storage.getObject(getStoragePath(strPath)); }; exports.putObject = function(strPath, buffer, contentLength) { return storage.putObject(getStoragePath(strPath), buffer, contentLength); }; exports.listObjects = function(strPath) { return storage.listObjects(getStoragePath(strPath)).catch(function(e) { logger.error('storage.listObjects:\r\n%s', e.stack); return []; }); }; exports.deleteObject = function(strPath) { return storage.deleteObject(getStoragePath(strPath)); }; exports.deleteObjects = function(strPaths) { var StoragePaths = strPaths.map(function(curValue) { return getStoragePath(curValue); }); return storage.deleteObjects(StoragePaths); }; exports.deletePath = function(strPath) { return new Promise(function(resolve, reject) { utils.spawn(function* () { try { var list = yield exports.listObjects(getStoragePath(strPath)); yield exports.deleteObjects(list); resolve(); } catch (err) { reject(err); } }); }); }; exports.getSignedUrl = function(baseUrl, strPath, optUrlExpires) { return storage.getSignedUrl(baseUrl, getStoragePath(strPath), optUrlExpires); }; exports.getSignedUrls = function(baseUrl, strPath, optUrlExpires) { return exports.listObjects(getStoragePath(strPath)).then(function(list) { return Promise.all(list.map(function(curValue) { return exports.getSignedUrl(baseUrl, curValue, optUrlExpires); })).then(function(urls) { var outputMap = {}; for (var i = 0; i < list.length && i < urls.length; ++i) { outputMap[exports.getRelativePath(strPath, list[i])] = urls[i]; } return outputMap; }); }); }; exports.getSignedUrlsByArray = function(baseUrl, list, optPath, optUrlExpires) { return Promise.all(list.map(function(curValue) { return exports.getSignedUrl(baseUrl, curValue, optUrlExpires); })).then(function(urls) { var outputMap = {}; for (var i = 0; i < list.length && i < urls.length; ++i) { if (optPath) { outputMap[exports.getRelativePath(optPath, list[i])] = urls[i]; } else { outputMap[list[i]] = urls[i]; } } return outputMap; }); }; exports.getRelativePath = function(strBase, strPath) { return strPath.substring(strBase.length + 1); }; \ No newline at end of file diff --git a/Common/sources/storage-fs.js b/Common/sources/storage-fs.js index f6e49147..0db6a13f 100644 --- a/Common/sources/storage-fs.js +++ b/Common/sources/storage-fs.js @@ -1 +1 @@ -var fs = require('fs'); var path = require('path'); var mkdirp = require('mkdirp'); var utils = require('./utils'); var config = require('./config.json'); var configStorage = config['storage']; var cfgBucketName = configStorage['bucketName']; var cfgStorageFolderName = configStorage['storageFolderName']; var configFs = configStorage['fs']; var cfgStorageFolderPath = configFs['folderPath']; function getFilePath(strPath) { return path.join(cfgStorageFolderPath, strPath); } function getOutputPath(strPath) { return strPath.replace(/\\/g, '/'); } function removeEmptyParent(strPath, done) { if (cfgStorageFolderPath.length + 1 >= strPath.length) { done(); } else { fs.readdir(strPath, function(err, list) { if (err) { //не реагируем на ошибку, потому скорее всего эта папка удалилась в соседнем потоке done(); } else { if (list.length > 0) { done(); } else { fs.rmdir(strPath, function(err) { if (err) { //не реагируем на ошибку, потому скорее всего эта папка удалилась в соседнем потоке done(); } else { removeEmptyParent(path.dirname(strPath), function(err) { done(err); }); } }); } } }); } } exports.getObject = function(strPath) { return new Promise(function(resolve, reject) { fs.readFile(getFilePath(strPath), function(err, data) { if (err) { reject(err); } else { resolve(data); } }); }); }; exports.putObject = function(strPath, buffer, contentLength) { return new Promise(function(resolve, reject) { var fsPath = getFilePath(strPath); mkdirp(path.dirname(fsPath), function(err) { if (err) { reject(err); } else { //todo 0666 if (Buffer.isBuffer(buffer)) { fs.writeFile(fsPath, buffer, function(err) { if (err) { reject(err); } else { resolve(); } }); } else { utils.promiseCreateWriteStream(fsPath).then(function(writable) { buffer.pipe(writable); }).catch(function(err) { reject(err); }); } } }); }); }; exports.listObjects = function(strPath) { return utils.listObjects(getFilePath(strPath)).then(function(values) { return values.map(function(curvalue) { return getOutputPath(curvalue.substring(cfgStorageFolderPath.length + 1)); }); }); }; exports.deleteObject = function(strPath) { return new Promise(function(resolve, reject) { var fsPath = getFilePath(strPath); fs.unlink(fsPath, function(err) { if (err) { reject(err); } else { //resolve(); removeEmptyParent(path.dirname(fsPath), function(err) { if (err) { reject(err); } else { resolve(); } }); } }); }); }; exports.deleteObjects = function(strPaths) { return Promise.all(strPaths.map(exports.deleteObject)); }; exports.getSignedUrl = function(baseUrl, strPath, optUrlExpires) { return new Promise(function(resolve, reject) { resolve(baseUrl + '/' + cfgBucketName + '/' + cfgStorageFolderName + '/' + strPath); }); }; \ No newline at end of file +var fs = require('fs'); var path = require('path'); var mkdirp = require('mkdirp'); var utils = require('./utils'); var configStorage = require('config').get('storage'); var cfgBucketName = configStorage.get('bucketName'); var cfgStorageFolderName = configStorage.get('storageFolderName'); var configFs = configStorage.get('fs'); var cfgStorageFolderPath = configFs.get('folderPath'); function getFilePath(strPath) { return path.join(cfgStorageFolderPath, strPath); } function getOutputPath(strPath) { return strPath.replace(/\\/g, '/'); } function removeEmptyParent(strPath, done) { if (cfgStorageFolderPath.length + 1 >= strPath.length) { done(); } else { fs.readdir(strPath, function(err, list) { if (err) { //не реагируем на ошибку, потому скорее всего эта папка удалилась в соседнем потоке done(); } else { if (list.length > 0) { done(); } else { fs.rmdir(strPath, function(err) { if (err) { //не реагируем на ошибку, потому скорее всего эта папка удалилась в соседнем потоке done(); } else { removeEmptyParent(path.dirname(strPath), function(err) { done(err); }); } }); } } }); } } exports.getObject = function(strPath) { return new Promise(function(resolve, reject) { fs.readFile(getFilePath(strPath), function(err, data) { if (err) { reject(err); } else { resolve(data); } }); }); }; exports.putObject = function(strPath, buffer, contentLength) { return new Promise(function(resolve, reject) { var fsPath = getFilePath(strPath); mkdirp(path.dirname(fsPath), function(err) { if (err) { reject(err); } else { //todo 0666 if (Buffer.isBuffer(buffer)) { fs.writeFile(fsPath, buffer, function(err) { if (err) { reject(err); } else { resolve(); } }); } else { utils.promiseCreateWriteStream(fsPath).then(function(writable) { buffer.pipe(writable); }).catch(function(err) { reject(err); }); } } }); }); }; exports.listObjects = function(strPath) { return utils.listObjects(getFilePath(strPath)).then(function(values) { return values.map(function(curvalue) { return getOutputPath(curvalue.substring(cfgStorageFolderPath.length + 1)); }); }); }; exports.deleteObject = function(strPath) { return new Promise(function(resolve, reject) { var fsPath = getFilePath(strPath); fs.unlink(fsPath, function(err) { if (err) { reject(err); } else { //resolve(); removeEmptyParent(path.dirname(fsPath), function(err) { if (err) { reject(err); } else { resolve(); } }); } }); }); }; exports.deleteObjects = function(strPaths) { return Promise.all(strPaths.map(exports.deleteObject)); }; exports.getSignedUrl = function(baseUrl, strPath, optUrlExpires) { return new Promise(function(resolve, reject) { resolve(baseUrl + '/' + cfgBucketName + '/' + cfgStorageFolderName + '/' + strPath); }); }; \ No newline at end of file diff --git a/Common/sources/storage-s3.js b/Common/sources/storage-s3.js index 30e60633..5048023a 100644 --- a/Common/sources/storage-s3.js +++ b/Common/sources/storage-s3.js @@ -1 +1 @@ -'use strict'; var config = require('./config.json'); var url = require('url'); var AWS = require('aws-sdk'); var mime = require('mime'); var configStorage = config['storage']; var cfgRegion = configStorage['region']; var cfgEndpoint = configStorage['endpoint']; var cfgBucketName = configStorage['bucketName']; var cfgStorageFolderName = configStorage['storageFolderName']; var cfgAccessKeyId = configStorage['accessKeyId']; var cfgSecretAccessKey = configStorage['secretAccessKey']; var cfgUseRequestToGetUrl = configStorage['useRequestToGetUrl']; /** * Don't hard-code your credentials! * Export the following environment variables instead: * * export AWS_ACCESS_KEY_ID='AKID' * export AWS_SECRET_ACCESS_KEY='SECRET' */ var config = { region: cfgRegion, endpoint: cfgEndpoint, accessKeyId: cfgAccessKeyId, secretAccessKey: cfgSecretAccessKey }; if (config.endpoint) { config.sslEnabled = false; config.s3ForcePathStyle = true; } AWS.config.update(config); var s3Client = new AWS.S3(); if (config.endpoint) { s3Client.endpoint = new AWS.Endpoint(config.endpoint); } var cfgEndpointParsed = null; if (cfgEndpoint) { cfgEndpointParsed = url.parse(cfgEndpoint); } //s3 allow only 1000 per request var MAX_DELETE_OBJECTS = 1000; function getFilePath(path) { //todo return cfgStorageFolderName + '/' + path; } function joinListObjects(inputArray, outputArray) { var length = inputArray.length; for (var i = 0; i < length; i++) { outputArray.push(inputArray[i].Key.substring((cfgStorageFolderName + '/').length)); } } function listObjectsExec(output, params, resolve, reject) { s3Client.listObjects(params, function(err, data) { if (err) { reject(err); } else { joinListObjects(data.Contents, output); if (data.IsTruncated) { params.Marker = data.NextMarker; listObjectsExec(output, params, resolve, reject); } else { resolve(output); } } }); } function mapDeleteObjects(currentValue) { return {Key: currentValue}; } function deleteObjectsHelp(aKeys) { return new Promise(function(resolve, reject) { //todo Quiet var params = {Bucket: cfgBucketName, Delete: {Objects: aKeys}}; s3Client.deleteObjects(params, function(err, data) { if (err) { reject(err); } else { resolve(data); } }); }); } exports.getObject = function(strPath) { return new Promise(function(resolve, reject) { var params = {Bucket: cfgBucketName, Key: getFilePath(strPath)}; s3Client.getObject(params, function(err, data) { if (err) { reject(err); } else { resolve(data.Body); } }); }); }; exports.putObject = function(strPath, buffer, contentLength) { return new Promise(function(resolve, reject) { var params = {Bucket: cfgBucketName, Key: getFilePath(strPath), Body: buffer, ContentLength: contentLength, ContentType: mime.lookup(strPath)}; s3Client.putObject(params, function(err, data) { if (err) { reject(err); } else { resolve(data); } }); }); }; exports.listObjects = function(strPath) { return new Promise(function(resolve, reject) { var params = {Bucket: cfgBucketName, Prefix: getFilePath(strPath)}; var output = []; listObjectsExec(output, params, resolve, reject); }); }; exports.deleteObject = function(strPath) { return new Promise(function(resolve, reject) { var params = {Bucket: cfgBucketName, Key: getFilePath(strPath)}; s3Client.deleteObject(params, function(err, data) { if (err) { reject(err); } else { resolve(data); } }); }); }; exports.deleteObjects = function(strPaths) { return new Promise(function(resolve) { resolve(strPaths.map(mapDeleteObjects)); }).then(function(aKeys) { var deletePromises = []; for (var i = 0; i < aKeys.length; i += MAX_DELETE_OBJECTS) { deletePromises.push(deleteObjectsHelp(aKeys.slice(i, i + MAX_DELETE_OBJECTS))); } return Promise.all(deletePromises); }); }; exports.getSignedUrl = function(baseUrl, strPath, optUrlExpires) { return new Promise(function(resolve, reject) { if (cfgUseRequestToGetUrl) { var params = { Bucket: cfgBucketName, Key: getFilePath(strPath), Expires: optUrlExpires }; s3Client.getSignedUrl('getObject', params, function(err, data) { if (err) { reject(err); } else { resolve(data); } }); } else { var host; if (cfgEndpointParsed && (cfgEndpointParsed.hostname == 'localhost' || cfgEndpointParsed.hostname == '127.0.0.1')) { host = baseUrl + cfgEndpointParsed.path; } else { host = cfgEndpoint; } if (host && host.length > 0 && '/' != host[host.length - 1]) { host += '/'; } resolve(host + cfgBucketName + '/' + cfgStorageFolderName + '/' + strPath); } }); }; \ No newline at end of file +'use strict'; var url = require('url'); var AWS = require('aws-sdk'); var mime = require('mime'); var configStorage = require('config').get('storage'); var cfgRegion = configStorage.get('region'); var cfgEndpoint = configStorage.get('endpoint'); var cfgBucketName = configStorage.get('bucketName'); var cfgStorageFolderName = configStorage.get('storageFolderName'); var cfgAccessKeyId = configStorage.get('accessKeyId'); var cfgSecretAccessKey = configStorage.get('secretAccessKey'); var cfgUseRequestToGetUrl = configStorage.get('useRequestToGetUrl'); /** * Don't hard-code your credentials! * Export the following environment variables instead: * * export AWS_ACCESS_KEY_ID='AKID' * export AWS_SECRET_ACCESS_KEY='SECRET' */ var config = { region: cfgRegion, endpoint: cfgEndpoint, accessKeyId: cfgAccessKeyId, secretAccessKey: cfgSecretAccessKey }; if (config.endpoint) { config.sslEnabled = false; config.s3ForcePathStyle = true; } AWS.config.update(config); var s3Client = new AWS.S3(); if (config.endpoint) { s3Client.endpoint = new AWS.Endpoint(config.endpoint); } var cfgEndpointParsed = null; if (cfgEndpoint) { cfgEndpointParsed = url.parse(cfgEndpoint); } //s3 allow only 1000 per request var MAX_DELETE_OBJECTS = 1000; function getFilePath(path) { //todo return cfgStorageFolderName + '/' + path; } function joinListObjects(inputArray, outputArray) { var length = inputArray.length; for (var i = 0; i < length; i++) { outputArray.push(inputArray[i].Key.substring((cfgStorageFolderName + '/').length)); } } function listObjectsExec(output, params, resolve, reject) { s3Client.listObjects(params, function(err, data) { if (err) { reject(err); } else { joinListObjects(data.Contents, output); if (data.IsTruncated) { params.Marker = data.NextMarker; listObjectsExec(output, params, resolve, reject); } else { resolve(output); } } }); } function mapDeleteObjects(currentValue) { return {Key: currentValue}; } function deleteObjectsHelp(aKeys) { return new Promise(function(resolve, reject) { //todo Quiet var params = {Bucket: cfgBucketName, Delete: {Objects: aKeys}}; s3Client.deleteObjects(params, function(err, data) { if (err) { reject(err); } else { resolve(data); } }); }); } exports.getObject = function(strPath) { return new Promise(function(resolve, reject) { var params = {Bucket: cfgBucketName, Key: getFilePath(strPath)}; s3Client.getObject(params, function(err, data) { if (err) { reject(err); } else { resolve(data.Body); } }); }); }; exports.putObject = function(strPath, buffer, contentLength) { return new Promise(function(resolve, reject) { var params = {Bucket: cfgBucketName, Key: getFilePath(strPath), Body: buffer, ContentLength: contentLength, ContentType: mime.lookup(strPath)}; s3Client.putObject(params, function(err, data) { if (err) { reject(err); } else { resolve(data); } }); }); }; exports.listObjects = function(strPath) { return new Promise(function(resolve, reject) { var params = {Bucket: cfgBucketName, Prefix: getFilePath(strPath)}; var output = []; listObjectsExec(output, params, resolve, reject); }); }; exports.deleteObject = function(strPath) { return new Promise(function(resolve, reject) { var params = {Bucket: cfgBucketName, Key: getFilePath(strPath)}; s3Client.deleteObject(params, function(err, data) { if (err) { reject(err); } else { resolve(data); } }); }); }; exports.deleteObjects = function(strPaths) { return new Promise(function(resolve) { resolve(strPaths.map(mapDeleteObjects)); }).then(function(aKeys) { var deletePromises = []; for (var i = 0; i < aKeys.length; i += MAX_DELETE_OBJECTS) { deletePromises.push(deleteObjectsHelp(aKeys.slice(i, i + MAX_DELETE_OBJECTS))); } return Promise.all(deletePromises); }); }; exports.getSignedUrl = function(baseUrl, strPath, optUrlExpires) { return new Promise(function(resolve, reject) { if (cfgUseRequestToGetUrl) { var params = { Bucket: cfgBucketName, Key: getFilePath(strPath), Expires: optUrlExpires }; s3Client.getSignedUrl('getObject', params, function(err, data) { if (err) { reject(err); } else { resolve(data); } }); } else { var host; if (cfgEndpointParsed && (cfgEndpointParsed.hostname == 'localhost' || cfgEndpointParsed.hostname == '127.0.0.1')) { host = baseUrl + cfgEndpointParsed.path; } else { host = cfgEndpoint; } if (host && host.length > 0 && '/' != host[host.length - 1]) { host += '/'; } resolve(host + cfgBucketName + '/' + cfgStorageFolderName + '/' + strPath); } }); }; \ No newline at end of file diff --git a/Common/sources/taskqueueDB.js b/Common/sources/taskqueueDB.js index 02d04c4d..f56cb500 100644 --- a/Common/sources/taskqueueDB.js +++ b/Common/sources/taskqueueDB.js @@ -5,10 +5,10 @@ var sqlBase = require('./../../CoAuthoring/sources/baseConnector'); var utils = require('./utils'); var commonDefines = require('./commondefines'); var constants = require('./constants'); -var config = require('./config.json'); +var config = require('config').get('queue'); -var cfgVisibilityTimeout = config['queue']['visibilityTimeout']; -var cfgRetentionPeriod = config['queue']['retentionPeriod']; +var cfgVisibilityTimeout = config.get('visibilityTimeout'); +var cfgRetentionPeriod = config.get('retentionPeriod'); var TABLE_NAME = 'convert_queue'; var DB_TIMEOUT = 1000; diff --git a/Common/sources/taskqueueRabbitMQ.js b/Common/sources/taskqueueRabbitMQ.js index 1bd0f84d..016aff8a 100644 --- a/Common/sources/taskqueueRabbitMQ.js +++ b/Common/sources/taskqueueRabbitMQ.js @@ -1,14 +1,14 @@ 'use strict'; -var config = require('./config.json'); +var config = require('config'); var events = require('events'); var util = require('util'); var utils = require('./utils'); var constants = require('./constants'); var rabbitMQCore = require('./rabbitMQCore'); -var cfgQueueRetentionPeriod = config['queue']['retentionPeriod']; -var cfgRabbitQueueConvertTask = config['rabbitmq']['queueconverttask']; -var cfgRabbitQueueConvertResponse = config['rabbitmq']['queueconvertresponse']; +var cfgQueueRetentionPeriod = config.get('queue.retentionPeriod'); +var cfgRabbitQueueConvertTask = config.get('rabbitmq.queueconverttask'); +var cfgRabbitQueueConvertResponse = config.get('rabbitmq.queueconvertresponse'); function TaskQueueRabbitMQ() { this.channelConvertTask = null;