origin_storage_manager
Version:
multi cloud's storage event manager
134 lines (108 loc) • 3.6 kB
JavaScript
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;