UNPKG

3.18 kBJavaScriptView Raw
1'use strict'
2
3/**
4 * Do not create S3 bucket.
5 * Put the Notification Configuration in the existing Bucket.
6 */
7class S3Events {
8 constructor (aws, region) {
9 // Authenticated `aws` object in `lib/main.js`
10 this.lambda = new aws.Lambda({
11 region: region,
12 apiVersion: '2015-03-31'
13 })
14 this.s3 = new aws.S3({
15 region: region,
16 apiVersion: '2006-03-01'
17 })
18 }
19
20 _functionName (params) {
21 return params.FunctionArn.split(':').pop()
22 }
23
24 _statementId (params) {
25 return params.Bucket.replace(/[^a-zA-Z0-9-_]/g, '_')
26 }
27
28 _addPermissionParams (params) {
29 return {
30 Action: 'lambda:InvokeFunction',
31 FunctionName: this._functionName(params),
32 Principal: 's3.amazonaws.com',
33 SourceArn: 'arn:aws:s3:::' + params.Bucket,
34 StatementId: this._statementId(params)
35 }
36 }
37
38 _addPermission (params) {
39 return new Promise((resolve, reject) => {
40 const _params = this._addPermissionParams(params)
41 this.lambda.addPermission(_params, (err, data) => {
42 if (err) {
43 if (err.code !== 'ResourceConflictException') reject(err)
44 // If it exists it will result in an error but there is no problem.
45 resolve('Permission already set')
46 }
47 resolve(data)
48 })
49 })
50 }
51
52 _lambdaFunctionConfiguration (params) {
53 const lambdaFunctionConfiguration = {
54 Events: params.Events,
55 LambdaFunctionArn: params.FunctionArn
56 }
57 if (params.Filter != null) {
58 lambdaFunctionConfiguration.Filter = params.Filter
59 }
60
61 return lambdaFunctionConfiguration
62 }
63
64 _paramsListToBucketNotificationConfigurations (paramsList) {
65 const lambdaFunctionConfigurations = {}
66 for (const params of paramsList) {
67 if (lambdaFunctionConfigurations[params.Bucket] == null) {
68 lambdaFunctionConfigurations[params.Bucket] = [
69 this._lambdaFunctionConfiguration(params)
70 ]
71 continue
72 }
73 lambdaFunctionConfigurations[params.Bucket].push(
74 this._lambdaFunctionConfiguration(params)
75 )
76 }
77 return Object.keys(lambdaFunctionConfigurations).map((bucket) => {
78 return {
79 Bucket: bucket,
80 NotificationConfiguration: {
81 LambdaFunctionConfigurations:
82 lambdaFunctionConfigurations[bucket]
83 }
84 }
85 })
86 }
87
88 _putBucketNotificationConfiguration (putBucketNotificationConfigurationParams) {
89 return new Promise((resolve, reject) => {
90 this.s3.putBucketNotificationConfiguration(putBucketNotificationConfigurationParams, (err, data) => {
91 if (err) reject(err)
92 resolve(data)
93 })
94 })
95 }
96
97 add (paramsList) {
98 return paramsList.map(params => {
99 return this._addPermission(params)
100 }).reduce((a, b) => {
101 return a.then(b)
102 }, Promise.resolve()).then(() => {
103 return this._paramsListToBucketNotificationConfigurations(paramsList).map(putBucketNotificationConfigurationParams => {
104 return this._putBucketNotificationConfiguration(putBucketNotificationConfigurationParams)
105 }).reduce((a, b) => {
106 return a.then(b)
107 }, Promise.resolve({}))
108 })
109 }
110}
111
112module.exports = S3Events