mirror of
https://github.com/ONLYOFFICE/server.git
synced 2026-04-07 14:04:35 +08:00
git-svn-id: svn://192.168.3.15/activex/AVS/Sources/TeamlabOffice/trunk/nodeJSProjects@65476 954022d7-b5bf-4e40-9824-e11837661b57
119 lines
4.5 KiB
JavaScript
119 lines
4.5 KiB
JavaScript
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 docsCoServer = require('./DocsCoServer');
|
|
var storage = require('./../../Common/sources/storage-base');
|
|
var formatChecker = require('./../../Common/sources/formatchecker');
|
|
var statsDClient = require('./../../Common/sources/statsdclient');
|
|
|
|
//todo
|
|
var CONVERT_TIMEOUT = 6 * 60 * 1000;
|
|
var CONVERT_ASYNC_DELAY = 1000;
|
|
|
|
var clientStatsD = statsDClient.getClient();
|
|
|
|
function* getConvertStatus(cmd, selectRes, req) {
|
|
var status = {url: undefined, err: constants.NO_ERROR};
|
|
if (selectRes.length > 0) {
|
|
var row = selectRes[0];
|
|
switch (row.tr_status) {
|
|
case taskResult.FileStatus.Ok:
|
|
status.url = yield storage.getSignedUrl(utils.getBaseUrlByRequest(req), cmd.getDocId() + '/' + cmd.getTitle());
|
|
break;
|
|
case taskResult.FileStatus.Err:
|
|
case taskResult.FileStatus.ErrToReload:
|
|
status.err = row.tr_status_info;
|
|
break;
|
|
case taskResult.FileStatus.NeedParams:
|
|
case taskResult.FileStatus.SaveVersion:
|
|
case taskResult.FileStatus.UpdateVersion:
|
|
status.err = constants.UNKNOWN;
|
|
break;
|
|
}
|
|
var lastOpenDate = row.tr_last_open_date;
|
|
//todo
|
|
if (new Date().getTime() - lastOpenDate.getTime() > CONVERT_TIMEOUT) {
|
|
status.err = constants.UNKNOWN;
|
|
}
|
|
}
|
|
return status;
|
|
}
|
|
|
|
exports.convert = function(req, res) {
|
|
utils.spawn(function* () {
|
|
var docId = 'null';
|
|
try {
|
|
var startDate = null;
|
|
if(clientStatsD) {
|
|
startDate = new Date();
|
|
}
|
|
var cmd = new commonDefines.InputCommand();
|
|
cmd.setCommand('conv');
|
|
cmd.setVKey(req.query['vkey']);
|
|
cmd.setUrl(req.query['url']);
|
|
cmd.setEmbeddedFonts(false);//req.query['embeddedfonts'];
|
|
cmd.setFormat(req.query['filetype']);
|
|
var outputtype = req.query['outputtype'];
|
|
docId = 'conv_' + req.query['key'] + '_' + outputtype;
|
|
cmd.setDocId(docId);
|
|
cmd.setTitle(constants.OUTPUT_NAME + '.' + outputtype);
|
|
cmd.setOutputFormat(formatChecker.getFormatFromString(outputtype));
|
|
cmd.setCodepage(commonDefines.c_oAscEncodingsMap[req.query['codePage']] || commonDefines.c_oAscCodePageUtf8);
|
|
cmd.setDelimiter(req.query['delimiter'] || commonDefines.c_oAscCsvDelimiter.Comma);
|
|
var async = 'true' == req.query['async'];
|
|
logger.debug('Start convert request docId = %s', docId);
|
|
|
|
var task = new taskResult.TaskResultData();
|
|
task.key = docId;
|
|
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);
|
|
var selectRes;
|
|
var status;
|
|
if (bExist) {
|
|
selectRes = yield taskResult.select(task);
|
|
status = yield* getConvertStatus(cmd, selectRes, req);
|
|
} else {
|
|
var queueData = new commonDefines.TaskQueueData();
|
|
queueData.setCmd(cmd);
|
|
queueData.setToFile(cmd.getTitle());
|
|
yield* docsCoServer.addTask(queueData, constants.QUEUE_PRIORITY_LOW);
|
|
//wait
|
|
if (!async) {
|
|
var waitTime = 0;
|
|
while (true) {
|
|
yield utils.sleep(CONVERT_ASYNC_DELAY);
|
|
selectRes = yield taskResult.select(task);
|
|
status = yield* getConvertStatus(cmd, selectRes, req);
|
|
waitTime += CONVERT_ASYNC_DELAY;
|
|
if (waitTime > CONVERT_TIMEOUT) {
|
|
status.err = constants.CONVERT_TIMEOUT;
|
|
}
|
|
if (status.url || constants.NO_ERROR != status.err) {
|
|
break;
|
|
}
|
|
}
|
|
} else {
|
|
status = {url: undefined, percent: 0, err: constants.NO_ERROR};
|
|
}
|
|
}
|
|
utils.fillXmlResponse(res, status.url, status.err);
|
|
logger.debug('End convert request url %s status %s docId = %s', status.url, status.err, docId);
|
|
if(clientStatsD) {
|
|
clientStatsD.timing('coauth.convertservice', new Date() - startDate);
|
|
}
|
|
}
|
|
catch (e) {
|
|
logger.error('Error convert: docId = %s\r\n%s', docId, e.stack);
|
|
utils.fillXmlResponse(res, undefined, constants.UNKNOWN);
|
|
}
|
|
});
|
|
};
|