-
Notifications
You must be signed in to change notification settings - Fork 0
/
AmazonAwsProvider.js
96 lines (79 loc) · 2.16 KB
/
AmazonAwsProvider.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
'use strict';
const S3Provider = require('../S3Provider');
class AmazonAwsProvider extends S3Provider {
constructor({
domain,
endpoint,
id,
title,
} = { domain: 'amazonaws.com', title: 'Amazon S3' }) {
super({ id, domain, endpoint, title });
this.endpoint = endpoint || (domain && `https://s3.{region}.${domain}`);
}
buildHostName({ s3Url }) {
return [
s3Url.bucketPosition === 'hostname' && s3Url.bucket,
s3Url.cdn ? 's3-accelerate' : 's3',
s3Url.region,
s3Url.domain || this.domain,
]
.filter(Boolean)
.join('.');
}
async buildSignedUrl({
accessKeyId,
secretAccessKey,
expires,
method,
s3Url,
}) {
const s3UrlCopy = s3Url.clone();
if (!s3UrlCopy.region) {
s3UrlCopy.setRegion('us-east-1');
}
if (s3UrlCopy.protocol === 's3:') {
s3UrlCopy.setProtocol('https:');
}
return super.buildSignedUrl({
accessKeyId,
secretAccessKey,
expires,
method,
s3Url: s3UrlCopy,
});
}
parseBucket(hostname, s3Url) {
const hostnameParts = hostname.split('.');
if (hostnameParts.slice(-1)[0] === 's3-accelerate') {
s3Url.setCdn(true);
s3Url.setRegion('');
s3Url.setBucket(hostnameParts.slice(-2)[0]);
s3Url.setBucketPosition('hostname');
return '';
}
// eslint-disable-next-line arrow-body-style
const s3Pos = hostnameParts.findIndex((p) => {
return p === 's3' || p.startsWith('s3-');
});
// like {bucket}.s3.amazonaws.com
if (s3Pos > 0) {
s3Url.setBucket(hostnameParts.slice(0, s3Pos).join('.'));
s3Url.setBucketPosition('hostname');
return hostnameParts.slice(s3Pos).join('.');
}
return hostname;
}
parseRegion(hostname, s3Url) {
const hostnameParts = hostname.split('.');
if (hostnameParts[0]?.startsWith('s3-')) {
s3Url.setRegion(hostnameParts[0].slice(3));
return hostnameParts.slice(1).join('.');
}
if (hostnameParts[0] === 's3' && hostnameParts[1]) {
s3Url.setRegion(hostnameParts[1]);
return hostnameParts.slice(2).join('.');
}
return hostname;
}
}
module.exports = AmazonAwsProvider;