overleaf/services/filestore/app/js/FileConverter.js

133 lines
3.6 KiB
JavaScript

/* eslint-disable
camelcase,
*/
// TODO: This file was created by bulk-decaffeinate.
// Fix any style issues and re-enable lint.
/*
* decaffeinate suggestions:
* DS102: Remove unnecessary code created because of implicit returns
* DS207: Consider shorter variations of null checks
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
*/
const _ = require('underscore')
const metrics = require('metrics-sharelatex')
const logger = require('logger-sharelatex')
const safe_exec = require('./SafeExec')
const approvedFormats = ['png']
const Settings = require('settings-sharelatex')
const fourtySeconds = 40 * 1000
const childProcessOpts = {
killSignal: 'SIGTERM',
timeout: fourtySeconds
}
module.exports = {
convert(sourcePath, requestedFormat, callback) {
logger.log({ sourcePath, requestedFormat }, 'converting file format')
const timer = new metrics.Timer('imageConvert')
const destPath = `${sourcePath}.${requestedFormat}`
sourcePath = `${sourcePath}[0]`
if (!_.include(approvedFormats, requestedFormat)) {
const err = new Error('invalid format requested')
return callback(err)
}
const width = '600x'
let command = [
'convert',
'-define',
`pdf:fit-page=${width}`,
'-flatten',
'-density',
'300',
sourcePath,
destPath
]
command = Settings.commands.convertCommandPrefix.concat(command)
return safe_exec(command, childProcessOpts, function(err, stdout, stderr) {
timer.done()
if (err != null) {
logger.err(
{ err, stderr, sourcePath, requestedFormat, destPath },
'something went wrong converting file'
)
} else {
logger.log(
{ sourcePath, requestedFormat, destPath },
'finished converting file'
)
}
return callback(err, destPath)
})
},
thumbnail(sourcePath, callback) {
const destPath = `${sourcePath}.png`
sourcePath = `${sourcePath}[0]`
const width = '260x'
let command = [
'convert',
'-flatten',
'-background',
'white',
'-density',
'300',
'-define',
`pdf:fit-page=${width}`,
sourcePath,
'-resize',
width,
destPath
]
logger.log({ sourcePath, destPath, command }, 'thumbnail convert file')
command = Settings.commands.convertCommandPrefix.concat(command)
return safe_exec(command, childProcessOpts, function(err, stdout, stderr) {
if (err != null) {
logger.err(
{ err, stderr, sourcePath },
'something went wrong converting file to thumbnail'
)
} else {
logger.log({ sourcePath, destPath }, 'finished thumbnailing file')
}
return callback(err, destPath)
})
},
preview(sourcePath, callback) {
logger.log({ sourcePath }, 'preview convert file')
const destPath = `${sourcePath}.png`
sourcePath = `${sourcePath}[0]`
const width = '548x'
let command = [
'convert',
'-flatten',
'-background',
'white',
'-density',
'300',
'-define',
`pdf:fit-page=${width}`,
sourcePath,
'-resize',
width,
destPath
]
command = Settings.commands.convertCommandPrefix.concat(command)
return safe_exec(command, childProcessOpts, function(err, stdout, stderr) {
if (err != null) {
logger.err(
{ err, stderr, sourcePath, destPath },
'something went wrong converting file to preview'
)
} else {
logger.log(
{ sourcePath, destPath },
'finished converting file to preview'
)
}
return callback(err, destPath)
})
}
}