FileWriter.coffee 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. fs = require 'fs'
  2. logger = require 'logger-sharelatex'
  3. uuid = require 'uuid'
  4. _ = require 'underscore'
  5. Settings = require 'settings-sharelatex'
  6. request = require 'request'
  7. module.exports = FileWriter =
  8. _ensureDumpFolderExists: (callback=(error)->) ->
  9. fs.mkdir Settings.path.dumpFolder, (error) ->
  10. if error? and error.code != 'EEXIST'
  11. # Ignore error about already existing
  12. return callback(error)
  13. callback(null)
  14. writeLinesToDisk: (identifier, lines, callback = (error, fsPath)->) ->
  15. callback = _.once(callback)
  16. fsPath = "#{Settings.path.dumpFolder}/#{identifier}_#{uuid.v4()}"
  17. FileWriter._ensureDumpFolderExists (error) ->
  18. return callback(error) if error?
  19. fs.writeFile fsPath, lines.join('\n'), (error) ->
  20. return callback(error) if error?
  21. callback(null, fsPath)
  22. writeStreamToDisk: (identifier, stream, callback = (error, fsPath) ->) ->
  23. callback = _.once(callback)
  24. fsPath = "#{Settings.path.dumpFolder}/#{identifier}_#{uuid.v4()}"
  25. stream.pause()
  26. FileWriter._ensureDumpFolderExists (error) ->
  27. return callback(error) if error?
  28. stream.resume()
  29. writeStream = fs.createWriteStream(fsPath)
  30. stream.pipe(writeStream)
  31. stream.on 'error', (err)->
  32. logger.err {err, identifier, fsPath}, "[writeStreamToDisk] something went wrong with incoming stream"
  33. callback(err)
  34. writeStream.on 'error', (err)->
  35. logger.err {err, identifier, fsPath}, "[writeStreamToDisk] something went wrong with writing to disk"
  36. callback(err)
  37. writeStream.on "finish", ->
  38. logger.log {identifier, fsPath}, "[writeStreamToDisk] write stream finished"
  39. callback null, fsPath
  40. writeUrlToDisk: (identifier, url, callback = (error, fsPath) ->) ->
  41. callback = _.once(callback)
  42. stream = request.get(url)
  43. stream.on 'response', (response) ->
  44. if 200 <= response.statusCode < 300
  45. FileWriter.writeStreamToDisk identifier, stream, callback
  46. else
  47. err = new Error("bad response from url: #{response.statusCode}")
  48. logger.err {err, identifier, url}, err.message
  49. callback(err)