| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197 |
- /* eslint-disable
- handle-callback-err,
- no-return-assign,
- */
- // 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
- */
- // This module is not used in production, which currently uses
- // S3PersistorManager. The intention is to migrate S3PersistorManager to use the
- // latest aws-sdk and delete this module so that PersistorManager would load the
- // same backend for both the 's3' and 'aws-sdk' options.
- const logger = require('logger-sharelatex')
- const aws = require('aws-sdk')
- const _ = require('underscore')
- const fs = require('fs')
- const Errors = require('./Errors')
- const s3 = new aws.S3()
- module.exports = {
- sendFile(bucketName, key, fsPath, callback) {
- logger.log({ bucketName, key }, 'send file data to s3')
- const stream = fs.createReadStream(fsPath)
- return s3.upload({ Bucket: bucketName, Key: key, Body: stream }, function(
- err,
- data
- ) {
- if (err != null) {
- logger.err(
- { err, Bucket: bucketName, Key: key },
- 'error sending file data to s3'
- )
- }
- return callback(err)
- })
- },
- sendStream(bucketName, key, stream, callback) {
- logger.log({ bucketName, key }, 'send file stream to s3')
- return s3.upload({ Bucket: bucketName, Key: key, Body: stream }, function(
- err,
- data
- ) {
- if (err != null) {
- logger.err(
- { err, Bucket: bucketName, Key: key },
- 'error sending file stream to s3'
- )
- }
- return callback(err)
- })
- },
- getFileStream(bucketName, key, opts, callback) {
- if (callback == null) {
- callback = function(err, res) {}
- }
- logger.log({ bucketName, key }, 'get file stream from s3')
- callback = _.once(callback)
- const params = {
- Bucket: bucketName,
- Key: key
- }
- if (opts.start != null && opts.end != null) {
- params.Range = `bytes=${opts.start}-${opts.end}`
- }
- const request = s3.getObject(params)
- const stream = request.createReadStream()
- stream.on('readable', () => callback(null, stream))
- return stream.on('error', function(err) {
- logger.err({ err, bucketName, key }, 'error getting file stream from s3')
- if (err.code === 'NoSuchKey') {
- return callback(
- new Errors.NotFoundError(`File not found in S3: ${bucketName}:${key}`)
- )
- }
- return callback(err)
- })
- },
- copyFile(bucketName, sourceKey, destKey, callback) {
- logger.log({ bucketName, sourceKey, destKey }, 'copying file in s3')
- const source = bucketName + '/' + sourceKey
- return s3.copyObject(
- { Bucket: bucketName, Key: destKey, CopySource: source },
- function(err) {
- if (err != null) {
- logger.err(
- { err, bucketName, sourceKey, destKey },
- 'something went wrong copying file in s3'
- )
- }
- return callback(err)
- }
- )
- },
- deleteFile(bucketName, key, callback) {
- logger.log({ bucketName, key }, 'delete file in s3')
- return s3.deleteObject({ Bucket: bucketName, Key: key }, function(err) {
- if (err != null) {
- logger.err(
- { err, bucketName, key },
- 'something went wrong deleting file in s3'
- )
- }
- return callback(err)
- })
- },
- deleteDirectory(bucketName, key, callback) {
- logger.log({ bucketName, key }, 'delete directory in s3')
- return s3.listObjects({ Bucket: bucketName, Prefix: key }, function(
- err,
- data
- ) {
- if (err != null) {
- logger.err(
- { err, bucketName, key },
- 'something went wrong listing prefix in s3'
- )
- return callback(err)
- }
- if (data.Contents.length === 0) {
- logger.log({ bucketName, key }, 'the directory is empty')
- return callback()
- }
- const keys = _.map(data.Contents, entry => ({
- Key: entry.Key
- }))
- return s3.deleteObjects(
- {
- Bucket: bucketName,
- Delete: {
- Objects: keys,
- Quiet: true
- }
- },
- function(err) {
- if (err != null) {
- logger.err(
- { err, bucketName, key: keys },
- 'something went wrong deleting directory in s3'
- )
- }
- return callback(err)
- }
- )
- })
- },
- checkIfFileExists(bucketName, key, callback) {
- logger.log({ bucketName, key }, 'check file existence in s3')
- return s3.headObject({ Bucket: bucketName, Key: key }, function(err, data) {
- if (err != null) {
- if (err.code === 'NotFound') {
- return callback(null, false)
- }
- logger.err(
- { err, bucketName, key },
- 'something went wrong checking head in s3'
- )
- return callback(err)
- }
- return callback(null, data.ETag != null)
- })
- },
- directorySize(bucketName, key, callback) {
- logger.log({ bucketName, key }, 'get project size in s3')
- return s3.listObjects({ Bucket: bucketName, Prefix: key }, function(
- err,
- data
- ) {
- if (err != null) {
- logger.err(
- { err, bucketName, key },
- 'something went wrong listing prefix in s3'
- )
- return callback(err)
- }
- if (data.Contents.length === 0) {
- logger.log({ bucketName, key }, 'the directory is empty')
- return callback()
- }
- let totalSize = 0
- _.each(data.Contents, entry => (totalSize += entry.Size))
- return callback(null, totalSize)
- })
- }
- }
|