This repository has been archived by the owner on Jan 28, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathindex.js
111 lines (98 loc) · 3.79 KB
/
index.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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
var AWS = require('aws-sdk');
var url = require('url');
var region = process.env.AWS_DEFAULT_REGION || 'us-east-1';
var sns = new AWS.SNS({ region: region });
var s3 = new AWS.S3({ region: region });
module.exports = {};
module.exports.usage = usage;
module.exports.touch = touch;
module.exports.createMessage = createMessage;
module.exports.list = list;
function usage() {
return 'Usage: s3touch <s3 path> [--topic <ARN string>] [--requesterpays]';
}
function touch(s3path, cache, topic, requesterPays, callback) {
var uri = url.parse(s3path);
var bucket = uri.hostname;
var objkey = (uri.pathname||'').substr(1);
if (uri.protocol !== 's3:' || !bucket || !objkey) return callback(new Error('Invalid S3 path "' + s3path + '"'));
createMessage(bucket, objkey, requesterPays, function(err, message) {
if (err) return callback(err);
if (topic) {
publishEvent(topic, message, callback);
} else if (cache[bucket]) {
publishEvent(cache[bucket], message, callback);
} else {
s3.getBucketNotification({ Bucket: bucket }, function(err, data) {
if (err) return callback(new Error('Could not get bucket SNS topic ("'+(err.message||err.statusCode)+'")'));
cache[bucket] = data.TopicConfiguration.Topic;
publishEvent(cache[bucket], message, callback);
});
}
});
}
function createMessage(bucket, objkey, requesterPays, callback) {
var params = { Bucket: bucket, Key: objkey }
if (requesterPays) params.RequestPayer = 'requester';
s3.headObject(params, function(err, data) {
if (err) return callback(new Error('Could not HEAD object ("'+(err.message||err.statusCode)+'")'));
var size = parseInt(data.ContentLength, 10);
var etag = JSON.parse(data.ETag);
var date = (new Date()).toISOString();
callback(null, {
"Records": [
{
"eventVersion": "2.0",
"eventSource": "aws:s3",
"awsRegion": region,
"eventTime": date,
"eventName": "ObjectCreated:CompleteMultipartUpload",
"s3": {
"s3SchemaVersion": "1.0",
"bucket": {
"name": bucket,
"arn": "arn:aws:s3:::" + bucket
},
"object": {
"key": objkey,
"size": size,
"eTag": etag
}
}
}
]
});
});
}
function publishEvent(topic, message, callback) {
sns.publish({ TopicArn: topic, Message: JSON.stringify(message) }, function(err, data) {
if (err) return callback(new Error('Could not send SNS message ("' + (err.message||err.statusCode) + '")'));
return callback(null, data);
});
}
function list(s3path, callback) {
var uri = url.parse(s3path);
var bucket = uri.hostname;
var prefix = (uri.pathname||'').substr(1);
if (uri.protocol !== 's3:' || !bucket || !prefix) return callback(new Error('Invalid S3 path "' + s3path + '"'));
var marker = null;
var result = [];
function list() {
s3.listObjects({
Bucket: bucket,
Prefix: prefix,
Marker: marker
}, function(err, data) {
if (err) return callback(err);
var i = data.Contents.length;
while (i--) result.unshift('s3://' + bucket + '/' + data.Contents[i].Key);
if (data.IsTruncated) {
marker = data.Contents.pop().Key;
list();
} else {
callback(null, result);
}
})
}
list();
}