overleaf/services/web/app/coffee/Features/Compile/CompileManager.coffee

99 lines
4 KiB
CoffeeScript
Raw Normal View History

2014-02-12 05:23:40 -05:00
Settings = require('settings-sharelatex')
2014-09-26 09:52:00 -04:00
redis = require("redis-sharelatex")
rclient = redis.createClient(Settings.redis.web)
2014-02-12 05:23:40 -05:00
DocumentUpdaterHandler = require "../DocumentUpdater/DocumentUpdaterHandler"
Project = require("../../models/Project").Project
ProjectRootDocManager = require "../Project/ProjectRootDocManager"
UserGetter = require "../User/UserGetter"
2014-02-12 05:23:40 -05:00
ClsiManager = require "./ClsiManager"
Metrics = require('../../infrastructure/Metrics')
logger = require("logger-sharelatex")
rateLimiter = require("../../infrastructure/RateLimiter")
2014-02-12 05:23:40 -05:00
module.exports = CompileManager =
compile: (project_id, user_id, options = {}, _callback = (error) ->) ->
2014-02-12 05:23:40 -05:00
timer = new Metrics.Timer("editor.compile")
callback = (args...) ->
timer.done()
_callback(args...)
@_checkIfAutoCompileLimitHasBeenHit options.isAutoCompile, (err, canCompile)->
2014-02-12 05:23:40 -05:00
if !canCompile
return callback null, "autocompile-backoff", []
2014-02-12 05:23:40 -05:00
logger.log project_id: project_id, user_id: user_id, "compiling project"
CompileManager._checkIfRecentlyCompiled project_id, user_id, (error, recentlyCompiled) ->
return callback(error) if error?
if recentlyCompiled
logger.warn {project_id, user_id}, "project was recently compiled so not continuing"
return callback null, "too-recently-compiled", []
2014-06-01 13:26:33 -04:00
2014-02-12 05:23:40 -05:00
CompileManager._ensureRootDocumentIsSet project_id, (error) ->
return callback(error) if error?
DocumentUpdaterHandler.flushProjectToMongo project_id, (error) ->
return callback(error) if error?
CompileManager.getProjectCompileLimits project_id, (error, limits) ->
2014-05-21 10:20:14 -04:00
return callback(error) if error?
for key, value of limits
options[key] = value
2016-06-02 08:09:11 -04:00
ClsiManager.sendRequest project_id, options, (error, status, outputFiles, clsiServerId, validationProblems) ->
return callback(error) if error?
logger.log files: outputFiles, "output files"
2016-06-02 08:09:11 -04:00
callback(null, status, outputFiles, clsiServerId, limits, validationProblems)
deleteAuxFiles: (project_id, callback = (error) ->) ->
CompileManager.getProjectCompileLimits project_id, (error, limits) ->
return callback(error) if error?
ClsiManager.deleteAuxFiles project_id, limits, callback
2014-02-12 05:23:40 -05:00
getProjectCompileLimits: (project_id, callback = (error, limits) ->) ->
Project.findById project_id, {owner_ref: 1}, (error, project) ->
return callback(error) if error?
UserGetter.getUser project.owner_ref, {"features":1}, (err, owner)->
return callback(error) if error?
callback null, {
timeout: owner.features?.compileTimeout || Settings.defaultFeatures.compileTimeout
compileGroup: owner.features?.compileGroup || Settings.defaultFeatures.compileGroup
}
2014-02-12 05:23:40 -05:00
COMPILE_DELAY: 1 # seconds
_checkIfRecentlyCompiled: (project_id, user_id, callback = (error, recentlyCompiled) ->) ->
key = "compile:#{project_id}:#{user_id}"
rclient.set key, true, "EX", @COMPILE_DELAY, "NX", (error, ok) ->
return callback(error) if error?
if ok == "OK"
return callback null, false
else
return callback null, true
_checkIfAutoCompileLimitHasBeenHit: (isAutoCompile, callback = (err, canCompile)->)->
if !isAutoCompile
return callback(null, true)
opts =
endpointName:"auto_compile"
timeInterval:20
subjectName:"everyone"
throttle: 25
rateLimiter.addCount opts, (err, canCompile)->
if err?
2014-02-12 05:23:40 -05:00
canCompile = false
logger.log canCompile:canCompile, opts:opts, "checking if auto compile limit has been hit"
2014-02-12 05:23:40 -05:00
callback err, canCompile
_ensureRootDocumentIsSet: (project_id, callback = (error) ->) ->
Project.findById project_id, 'rootDoc_id', (error, project)=>
return callback(error) if error?
if !project?
return callback new Error("project not found")
if project.rootDoc_id?
callback()
else
ProjectRootDocManager.setRootDocAutomatically project_id, callback
2015-09-11 08:53:06 -04:00
wordCount: (project_id, file, callback = (error) ->) ->
2015-09-10 11:41:48 -04:00
CompileManager.getProjectCompileLimits project_id, (error, limits) ->
return callback(error) if error?
2015-09-11 08:53:06 -04:00
ClsiManager.wordCount project_id, file, limits, callback