1
+ const aws = require ( "aws-sdk" ) ;
2
+ const fs = require ( "fs" ) ;
3
+ const path = require ( "path" ) ;
4
+ const mime = require ( "mime-types" ) ;
5
+
6
+ const s3 = new aws . S3 ( ) ;
7
+
8
+ const SUCCESS = "SUCCESS" ;
9
+ const FAILED = "FAILED" ;
10
+
11
+ const BUCKET = process . env . BUCKET ;
12
+
13
+ exports . staticHandler = function ( event , context ) {
14
+ if ( event . RequestType !== "Create" && event . RequestType !== "Update" ) {
15
+ return respond ( event , context , SUCCESS , { } ) ;
16
+ }
17
+
18
+ Promise . all ( walkSync ( "./" ) . map ( file => {
19
+ var fileType = mime . lookup ( file ) || "application/octet-stream" ;
20
+
21
+ console . log ( `${ file } -> ${ fileType } ` ) ;
22
+
23
+ return s3 . upload ( {
24
+ Body : fs . createReadStream ( file ) ,
25
+ Bucket : BUCKET ,
26
+ ContentType : fileType ,
27
+ Key : file ,
28
+ ACL : "private" ,
29
+ } ) . promise ( ) ;
30
+ } ) ) . then ( ( msg ) => {
31
+ respond ( event , context , SUCCESS , { } ) ;
32
+ } ) . catch ( err => {
33
+ respond ( event , context , FAILED , { Message : err } ) ;
34
+ } ) ;
35
+ } ;
36
+
37
+ // List all files in a directory in Node.js recursively in a synchronous fashion
38
+ function walkSync ( dir , filelist ) {
39
+ var files = fs . readdirSync ( dir ) ;
40
+ filelist = filelist || [ ] ;
41
+
42
+ files . forEach ( function ( file ) {
43
+ if ( fs . statSync ( path . join ( dir , file ) ) . isDirectory ( ) ) {
44
+ filelist = walkSync ( path . join ( dir , file ) , filelist ) ;
45
+ } else {
46
+ filelist . push ( path . join ( dir , file ) ) ;
47
+ }
48
+ } ) ;
49
+
50
+ return filelist ;
51
+ } ;
52
+
53
+ function respond ( event , context , responseStatus , responseData , physicalResourceId , noEcho ) {
54
+ var responseBody = JSON . stringify ( {
55
+ Status : responseStatus ,
56
+ Reason : "See the details in CloudWatch Log Stream: " + context . logStreamName ,
57
+ PhysicalResourceId : physicalResourceId || context . logStreamName ,
58
+ StackId : event . StackId ,
59
+ RequestId : event . RequestId ,
60
+ LogicalResourceId : event . LogicalResourceId ,
61
+ NoEcho : noEcho || false ,
62
+ Data : responseData
63
+ } ) ;
64
+
65
+ console . log ( "Response body:\n" , responseBody ) ;
66
+
67
+ var https = require ( "https" ) ;
68
+ var url = require ( "url" ) ;
69
+
70
+ var parsedUrl = url . parse ( event . ResponseURL ) ;
71
+ var options = {
72
+ hostname : parsedUrl . hostname ,
73
+ port : 443 ,
74
+ path : parsedUrl . path ,
75
+ method : "PUT" ,
76
+ headers : {
77
+ "content-type" : "" ,
78
+ "content-length" : responseBody . length
79
+ }
80
+ } ;
81
+
82
+ var request = https . request ( options , function ( response ) {
83
+ console . log ( "Status code: " + response . statusCode ) ;
84
+ console . log ( "Status message: " + response . statusMessage ) ;
85
+ context . done ( ) ;
86
+ } ) ;
87
+
88
+ request . on ( "error" , function ( error ) {
89
+ console . log ( "send(..) failed executing https.request(..): " + error ) ;
90
+ context . done ( ) ;
91
+ } ) ;
92
+
93
+ request . write ( responseBody ) ;
94
+ request . end ( ) ;
95
+ }
0 commit comments