UNPKG

origin_storage_manager

Version:

multi cloud's storage event manager

134 lines (108 loc) 3.6 kB
import AWS from 'aws-sdk'; import Storage from './storage'; import { downloadBlob } from '../cores/fileDownload'; class S3Manager extends Storage { constructor(s3SDK, expiration, region) { super(s3SDK, expiration, region); } upload(params, subscriber, cbAssume) { this.storageSDK.createMultipartUpload({ Key: params.Key }, (err, data) => { if (!err) { params.UploadId = data.UploadId; subscriber.publish('onReady', params.UploadId); const uploader = { postMessage: (hash) => { const fileTag = { TagSet: [{ Key: 'hd-md5', Value: hash }] }; this.uploadFile(params, fileTag, subscriber, cbAssume); } }; this.calculateFileMD5AndUpload(params.Body, uploader, subscriber); } else { if (this.isInvalidAccessKeyId(err)) { this.resetAssumeRole(cbAssume, () => { this.upload(params, subscriber, cbAssume); }); } subscriber.publish('onError'); } }); }; downloadFile(name, path, subscriber, cbAssume) { this.storageSDK.getObject({ Key: path }, (err, data) => { if (err) { subscriber.publish('onError'); this.resetAssumeRole(cbAssume, () => this.downloadFile(name, path, subscriber, cbAssume)); } else { const blob = new Blob([data.Body.buffer], { type: data.ContentType }); downloadBlob(blob, name); subscriber.publish('onCompleted'); } }); }; abortUpload(params, subscriber, cbAssume) { this.storageSDK.abortMultipartUpload(params, (err) => { if (!err) { subscriber.publish('onRefuse'); } else { this.resetAssumeRole(cbAssume, () => this.abortUpload(params, subscriber, cbAssume)); } }); }; makeCredential (credentials) { const awsCredentials = new AWS.Credentials( credentials.AccessKeyId, credentials.SecretAccessKey, credentials.SessionToken ); AWS.config.update({ credentials: awsCredentials, region: this.region }); return new AWS.S3({ params: { Bucket: credentials.BucketName } }); }; uploadFile (params, fileTag, subscriber, cbAssume) { const options = { partSize: 10 * 1024 * 1024, queueSize: 1 }; this.storageSDK .upload(params, options) .on('httpUploadProgress', (evt) => { const progress = Math.floor((evt.loaded / evt.total) * 100); subscriber.publish('onProgress', progress); }) .send((err, data) => { if (!err) { const putParams = { Key: params.Key, Tagging: fileTag }; this.putObjectTagging(putParams, subscriber, cbAssume); } else { subscriber.publish('onError'); this.resetAssumeRole(cbAssume, () => { this.uploadFile(params, fileTag, subscriber, cbAssume); }); } }); }; putObjectTagging (params, subscriber, cbAssume) { this.storageSDK.putObjectTagging(params, (err, data) => { if (!err) { subscriber.publish('onCompleted'); } else if (err) { subscriber.publish('onError'); this.resetAssumeRole(cbAssume, () => { this.putObjectTagging(params, subscriber, cbAssume); }); } }); }; isInvalidAccessKeyId (err) { return err.name === 'InvalidAccessKeyId' }; } export default S3Manager;