s3Wrapper.coffee 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. settings = require("settings-sharelatex")
  2. request = require("request")
  3. logger = require("logger-sharelatex")
  4. fs = require("fs")
  5. knox = require("knox")
  6. path = require("path")
  7. LocalFileWriter = require("./LocalFileWriter")
  8. _ = require("underscore")
  9. thirtySeconds = 30 * 1000
  10. buildDefaultOptions = (bucketName, method, key)->
  11. return {
  12. aws:
  13. key: settings.s3.key
  14. secret: settings.s3.secret
  15. bucket: bucketName
  16. method: method
  17. timeout: thirtySeconds
  18. uri:"https://#{bucketName}.s3.amazonaws.com/#{key}"
  19. }
  20. module.exports =
  21. sendFileToS3: (bucketName, key, fsPath, callback)->
  22. s3Client = knox.createClient
  23. key: settings.s3.key
  24. secret: settings.s3.secret
  25. bucket: bucketName
  26. putEventEmiter = s3Client.putFile fsPath, key, (err, res)->
  27. if err?
  28. logger.err err:err, bucketName:bucketName, key:key, fsPath:fsPath,"something went wrong uploading file to s3"
  29. return callback(err)
  30. if res.statusCode != 200
  31. logger.err bucketName:bucketName, key:key, fsPath:fsPath, "non 200 response from s3 putting file"
  32. return callback("non 200 response from s3 on put file")
  33. LocalFileWriter.deleteFile fsPath, (err)->
  34. logger.log res:res, bucketName:bucketName, key:key, fsPath:fsPath,"file uploaded to s3"
  35. callback(err)
  36. putEventEmiter.on "error", (err)->
  37. logger.err err:err, bucketName:bucketName, key:key, fsPath:fsPath, "error emmited on put of file"
  38. callback err
  39. sendStreamToS3: (bucketName, key, readStream, callback)->
  40. logger.log bucketName:bucketName, key:key, "sending file to s3"
  41. readStream.on "error", (err)->
  42. logger.err bucketName:bucketName, key:key, "error on stream to send to s3"
  43. LocalFileWriter.writeStream readStream, null, (err, fsPath)=>
  44. if err?
  45. logger.err bucketName:bucketName, key:key, fsPath:fsPath, err:err, "something went wrong writing stream to disk"
  46. return callback(err)
  47. @sendFileToS3 bucketName, key, fsPath, callback
  48. getFileStream: (bucketName, key, callback)->
  49. logger.log bucketName:bucketName, key:key, "getting file from s3"
  50. options = buildDefaultOptions(bucketName, "get", key)
  51. readStream = request(options)
  52. readStream.on "error", (err)->
  53. logger.err bucketName:bucketName, key:key, "error getting file stream from s3"
  54. callback null, readStream
  55. copyFile: (bucketName, sourceKey, destKey, callback)->
  56. logger.log bucketName:bucketName, sourceKey:sourceKey, destKey:destKey, "copying file in s3"
  57. s3Client = knox.createClient
  58. key: settings.s3.key
  59. secret: settings.s3.secret
  60. bucket: bucketName
  61. s3Client.copyFile sourceKey, destKey, (err)->
  62. if err?
  63. logger.err bucketName:bucketName, sourceKey:sourceKey, destKey:destKey, "something went wrong copying file in aws"
  64. callback(err)
  65. deleteFile: (bucketName, key, callback)->
  66. logger.log bucketName:bucketName, key:key, "delete file in s3"
  67. options = buildDefaultOptions(bucketName, "delete", key)
  68. request options, (err, res)->
  69. if err?
  70. logger.err res:res, bucketName:bucketName, key:key, "something went wrong deleting file in aws"
  71. callback(err)
  72. deleteDirectory: (bucketName, key, callback)->
  73. s3Client = knox.createClient
  74. key: settings.s3.key
  75. secret: settings.s3.secret
  76. bucket: bucketName
  77. s3Client.list prefix:key, (err, data)->
  78. keys = _.map data.Contents, (entry)->
  79. return entry.Key
  80. s3Client.deleteMultiple keys, callback
  81. checkIfFileExists:(bucketName, key, callback)->
  82. logger.log bucketName:bucketName, key:key, "checking if file exists in s3"
  83. options = buildDefaultOptions(bucketName, "head", key)
  84. request options, (err, res)->
  85. if err?
  86. logger.err res:res, bucketName:bucketName, key:key, "something went wrong copying file in aws"
  87. exists = res.statusCode == 200
  88. logger.log bucketName:bucketName, key:key, exists:exists, "checked if file exsists in s3"
  89. callback(err, exists)