overleaf/services/web/app/coffee/infrastructure/FileWriter.coffee

61 lines
2.1 KiB
CoffeeScript
Raw Normal View History

2018-02-14 15:12:46 +00:00
fs = require 'fs'
logger = require 'logger-sharelatex'
uuid = require 'uuid'
_ = require 'underscore'
Settings = require 'settings-sharelatex'
2018-03-08 17:24:54 +00:00
request = require 'request'
2018-02-14 15:12:46 +00:00
2018-03-08 17:24:54 +00:00
module.exports = FileWriter =
2018-05-03 13:29:03 +00:00
_ensureDumpFolderExists: (callback=(error)->) ->
2018-05-03 13:29:03 +00:00
fs.mkdir Settings.path.dumpFolder, (error) ->
if error? and error.code != 'EEXIST'
# Ignore error about already existing
return callback(error)
callback(null)
writeLinesToDisk: (identifier, lines, callback = (error, fsPath)->) ->
FileWriter.writeContentToDisk(identifier, lines.join('\n'), callback)
writeContentToDisk: (identifier, content, callback = (error, fsPath)->) ->
callback = _.once(callback)
fsPath = "#{Settings.path.dumpFolder}/#{identifier}_#{uuid.v4()}"
FileWriter._ensureDumpFolderExists (error) ->
return callback(error) if error?
fs.writeFile fsPath, content, (error) ->
2018-05-03 13:29:03 +00:00
return callback(error) if error?
callback(null, fsPath)
2018-02-14 15:12:46 +00:00
writeStreamToDisk: (identifier, stream, callback = (error, fsPath) ->) ->
callback = _.once(callback)
fsPath = "#{Settings.path.dumpFolder}/#{identifier}_#{uuid.v4()}"
stream.pause()
FileWriter._ensureDumpFolderExists (error) ->
return callback(error) if error?
stream.resume()
2018-02-14 15:12:46 +00:00
writeStream = fs.createWriteStream(fsPath)
stream.pipe(writeStream)
stream.on 'error', (err)->
logger.err {err, identifier, fsPath}, "[writeStreamToDisk] something went wrong with incoming stream"
callback(err)
writeStream.on 'error', (err)->
logger.err {err, identifier, fsPath}, "[writeStreamToDisk] something went wrong with writing to disk"
callback(err)
writeStream.on "finish", ->
logger.log {identifier, fsPath}, "[writeStreamToDisk] write stream finished"
callback null, fsPath
2018-03-08 17:24:54 +00:00
writeUrlToDisk: (identifier, url, callback = (error, fsPath) ->) ->
callback = _.once(callback)
stream = request.get(url)
stream.on 'response', (response) ->
if 200 <= response.statusCode < 300
FileWriter.writeStreamToDisk identifier, stream, callback
else
err = new Error("bad response from url: #{response.statusCode}")
logger.err {err, identifier, url}, err.message
2018-05-03 13:29:03 +00:00
callback(err)