in packages/storage/src/providers/AWSS3Provider.ts [360:486]
public async get<T extends S3ProviderGetConfig & StorageOptions>(
key: string,
config?: T
): Promise<S3ProviderGetOuput<T>>;
public async get(
key: string,
config?: S3ProviderGetConfig
): Promise<string | GetObjectCommandOutput> {
const credentialsOK = await this._ensureCredentials();
if (!credentialsOK || !this._isWithCredentials(this._config)) {
throw new Error(StorageErrorStrings.NO_CREDENTIALS);
}
const opt = Object.assign({}, this._config, config);
const {
bucket,
download,
cacheControl,
contentDisposition,
contentEncoding,
contentLanguage,
contentType,
expires,
track,
SSECustomerAlgorithm,
SSECustomerKey,
SSECustomerKeyMD5,
progressCallback,
} = opt;
const prefix = this._prefix(opt);
const final_key = prefix + key;
const emitter = new events.EventEmitter();
const s3 = this._createNewS3Client(opt, emitter);
logger.debug('get ' + key + ' from ' + final_key);
const params: GetObjectCommandInput = {
Bucket: bucket,
Key: final_key,
};
// See: https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#getObject-property
if (cacheControl) params.ResponseCacheControl = cacheControl;
if (contentDisposition)
params.ResponseContentDisposition = contentDisposition;
if (contentEncoding) params.ResponseContentEncoding = contentEncoding;
if (contentLanguage) params.ResponseContentLanguage = contentLanguage;
if (contentType) params.ResponseContentType = contentType;
if (SSECustomerAlgorithm) {
params.SSECustomerAlgorithm = SSECustomerAlgorithm;
}
if (SSECustomerKey) {
params.SSECustomerKey = SSECustomerKey;
}
if (SSECustomerKeyMD5) {
params.SSECustomerKeyMD5 = SSECustomerKeyMD5;
}
if (download === true) {
const getObjectCommand = new GetObjectCommand(params);
try {
if (progressCallback) {
if (typeof progressCallback === 'function') {
emitter.on(SEND_DOWNLOAD_PROGRESS_EVENT, progress => {
progressCallback(progress);
});
} else {
logger.warn(
'progressCallback should be a function, not a ' +
typeof progressCallback
);
}
}
const response = await s3.send(getObjectCommand);
emitter.removeAllListeners(SEND_DOWNLOAD_PROGRESS_EVENT);
dispatchStorageEvent(
track,
'download',
{ method: 'get', result: 'success' },
{
fileSize: Number(response.Body['size'] || response.Body['length']),
},
`Download success for ${key}`
);
return response;
} catch (error) {
dispatchStorageEvent(
track,
'download',
{
method: 'get',
result: 'failed',
},
null,
`Download failed with ${error.message}`
);
throw error;
}
}
try {
const signer = new S3RequestPresigner({ ...s3.config });
const request = await createRequest(s3, new GetObjectCommand(params));
// Default is 15 mins as defined in V2 AWS SDK
const url = formatUrl(
await signer.presign(request, {
expiresIn: expires || DEFAULT_PRESIGN_EXPIRATION,
})
);
dispatchStorageEvent(
track,
'getSignedUrl',
{ method: 'get', result: 'success' },
null,
`Signed URL: ${url}`
);
return url;
} catch (error) {
logger.warn('get signed url error', error);
dispatchStorageEvent(
track,
'getSignedUrl',
{ method: 'get', result: 'failed' },
null,
`Could not get a signed URL for ${key}`
);
throw error;
}
}