17
17
module . exports = function ( RED ) {
18
18
"use strict" ;
19
19
var fs = require ( 'fs' ) ;
20
+ var minimatch = require ( "minimatch" ) ;
21
+
22
+ function AmazonS3InNode ( n ) {
23
+ RED . nodes . createNode ( this , n ) ;
24
+ this . awsConfig = RED . nodes . getNode ( n . aws ) ;
25
+ this . region = n . region ;
26
+ this . bucket = n . bucket ;
27
+ this . filepattern = n . filepattern || "" ;
28
+ var node = this ;
29
+ var AWS = this . awsConfig ? this . awsConfig . AWS : null ;
30
+ if ( ! AWS ) {
31
+ node . warn ( "Missing AWS credentials" ) ;
32
+ return ;
33
+ }
34
+ var s3 = new AWS . S3 ( ) ;
35
+ node . status ( { fill :"blue" , shape :"dot" , text :"initializing" } ) ;
36
+ s3 . listObjects ( { Bucket : node . bucket } , function ( err , data ) {
37
+ if ( err ) {
38
+ node . error ( "failed to fetch S3 state: " + err ) ;
39
+ node . status ( { fill :"red" , shape :"ring" , text :"error" } ) ;
40
+ return ;
41
+ }
42
+ node . state = data . Contents . filter ( function ( e ) {
43
+ return ! node . filepattern || minimatch ( e , node . filepattern ) ;
44
+ } ) . map ( function ( e ) {
45
+ return e . Key ;
46
+ } ) ;
47
+ node . status ( { } ) ;
48
+ node . on ( "input" , function ( msg ) {
49
+ node . status ( { fill :"blue" , shape :"dot" , text :"checking for changes" } ) ;
50
+ s3 . listObjects ( { Bucket : node . bucket } , function ( err , data ) {
51
+ if ( err ) {
52
+ node . warn ( "failed to fetch S3 state: " + err ) ;
53
+ node . status ( { } ) ;
54
+ return ;
55
+ }
56
+ node . status ( { } ) ;
57
+ var newState = data . Contents . filter ( function ( e ) {
58
+ return ! node . filepattern ||
59
+ minimatch ( e , node . filepattern ) ;
60
+ } ) . map ( function ( e ) {
61
+ return e . Key ;
62
+ } ) ;
63
+ var seen = { } ;
64
+ var i ;
65
+ for ( i = 0 ; i < node . state . length ; i ++ ) {
66
+ seen [ node . state [ i ] ] = true ;
67
+ }
68
+ for ( i = 0 ; i < newState . length ; i ++ ) {
69
+ if ( seen [ newState [ i ] ] ) {
70
+ delete seen [ newState [ i ] ] ;
71
+ } else {
72
+ msg . payload = newState [ i ] ;
73
+ msg . file = newState [ i ] . substring ( newState [ i ] . lastIndexOf ( '/' ) + 1 ) ;
74
+ msg . event = 'add' ;
75
+ node . send ( msg ) ;
76
+ }
77
+ }
78
+ for ( var k in seen ) {
79
+ if ( seen . hasOwnProperty ( k ) ) {
80
+ msg . payload = k ;
81
+ msg . file = k . substring ( k . lastIndexOf ( '/' ) + 1 ) ;
82
+ msg . event = 'delete' ;
83
+ node . send ( msg ) ;
84
+ }
85
+ }
86
+ node . state = newState ;
87
+ } ) ;
88
+ } ) ;
89
+ var interval = setInterval ( function ( ) {
90
+ node . emit ( "input" , { } ) ;
91
+ } , 900000 ) ; // 15 minutes
92
+ node . on ( "close" , function ( ) {
93
+ if ( interval !== null ) {
94
+ clearInterval ( interval ) ;
95
+ }
96
+ } ) ;
97
+ } ) ;
98
+ }
99
+ RED . nodes . registerType ( "amazon s3 in" , AmazonS3InNode ) ;
20
100
21
101
function AmazonS3QueryNode ( n ) {
22
102
RED . nodes . createNode ( this , n ) ;
@@ -32,7 +112,6 @@ module.exports = function(RED) {
32
112
}
33
113
var s3 = new AWS . S3 ( ) ;
34
114
node . on ( "input" , function ( msg ) {
35
- msg . filename = filename ;
36
115
var bucket = node . bucket || msg . bucket ;
37
116
if ( bucket === "" ) {
38
117
node . warn ( "No bucket specified" ) ;
@@ -43,6 +122,7 @@ module.exports = function(RED) {
43
122
node . warn ( "No filename specified" ) ;
44
123
return ;
45
124
}
125
+ msg . bucket = bucket ;
46
126
msg . filename = filename ;
47
127
node . status ( { fill :"blue" , shape :"dot" , text :"downloading" } ) ;
48
128
s3 . getObject ( {
0 commit comments