Skip to content

Commit 773348a

Browse files
committed
feat: add aws s3 provider
1 parent 3966e90 commit 773348a

File tree

4 files changed

+120
-0
lines changed

4 files changed

+120
-0
lines changed

src/providers/aws.js

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
const AbstractFileTransfer = require('ms-files-transport');
2+
const S3 = require('aws-sdk/clients/s3');
3+
const { merge } = require('lodash');
4+
const assert = require('assert');
5+
6+
const UPLOAD_URL_EXPIRES_IN_SEC = 60000;
7+
const DOWNLOAD_URL_EXPIRES_IN_SEC = 60000;
8+
9+
class AWSTransport extends AbstractFileTransfer {
10+
constructor(opts = {}) {
11+
super();
12+
13+
const config = merge({}, AWSTransport.defaultOpts, opts);
14+
this._config = config;
15+
this._logger = this._config.logger;
16+
17+
assert(config !== undefined);
18+
assert(config.options !== undefined);
19+
assert(config.options.accessKeyId !== undefined);
20+
assert(config.options.secretAccessKey !== undefined);
21+
assert(config.options.region !== undefined);
22+
assert(config.options.bucketName !== undefined);
23+
24+
this.setupS3();
25+
}
26+
27+
setupS3() {
28+
try {
29+
this._s3 = new S3({
30+
signatureVersion: 'v4',
31+
region: this._config.region,
32+
credentials: {
33+
accessKeyId: this._config.accessKeyId,
34+
secretAccessKey: this._config.secretAccessKey,
35+
},
36+
});
37+
} catch (e) {
38+
this._logger.warn('failed to load aws-sdk/clients/s3', e);
39+
}
40+
}
41+
42+
connect() {
43+
return Promise
44+
.bind(this)
45+
.then(this.findOrCreateBucket);
46+
}
47+
48+
async findOrCreateBucket() {
49+
const { bucketName } = this._config;
50+
51+
const s3 = this._s3;
52+
53+
const buckets = s3.listBuckets();
54+
const exists = buckets.find(bucketName);
55+
56+
if (!exists) {
57+
this.log.debug('initiating createBucket: %s', bucketName);
58+
await this._s3.createBucket({
59+
Bucket: bucketName,
60+
});
61+
}
62+
}
63+
64+
async getSignedUrl(action, input) {
65+
const params = {
66+
Bucket: this._config.bucketName,
67+
Expires: action === 'putObject' ? UPLOAD_URL_EXPIRES_IN_SEC : DOWNLOAD_URL_EXPIRES_IN_SEC,
68+
Key: input.key,
69+
};
70+
71+
if (action === 'putObject') {
72+
params.ContentType = input.contentType;
73+
}
74+
75+
return new Promise((resolve, reject) => {
76+
this._s3.getSignedUrl('putObject', params, (err, url) => {
77+
if (err) {
78+
return reject(err);
79+
}
80+
return resolve(url);
81+
});
82+
});
83+
}
84+
}
85+
86+
AWSTransport.defaultOpts = {};
87+
88+
module.exports = AWSTransport;

src/providers/factory.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,14 @@ class ProviderFactory {
5757

5858
return provider;
5959
}
60+
61+
// eslint-disable-next-line class-methods-use-this
62+
getProviderAWS(transport) {
63+
const ProviderAWS = require('./aws');
64+
const provider = new ProviderAWS(transport);
65+
66+
return provider;
67+
}
6068
}
6169

6270
module.exports = ProviderFactory;

src/providers/index.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,12 @@ function initProviders(service) {
5454
factory.getProviderOSS(transport)
5555
);
5656
}
57+
58+
if (transport.name === 'aws') {
59+
service.providers.push(
60+
factory.getProviderAWS(transport)
61+
);
62+
}
5763
}
5864

5965
// create providerByBucket map for fast access

test/suites/providers/aws.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// const { strictEqual } = require('assert');
2+
const AWSTransport = require('../../../src/providers/aws');
3+
4+
describe('util fetch-data suite', () => {
5+
it('should be able to create instance', () => {
6+
const provider = new AWSTransport({
7+
options: {
8+
accessKeyId: 'AKIASS5V3WV23VA4KYOF',
9+
accessKeySecret: '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',
10+
bucket: 'test',
11+
region: 'us-west-2',
12+
secure: true,
13+
},
14+
});
15+
16+
console.log(provider);
17+
});
18+
});

0 commit comments

Comments
 (0)