forked from duoxoud/express-brute-dynamo
-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
109 lines (101 loc) · 3.45 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
var AbstractClientStore = require('express-brute/lib/AbstractClientStore');
var xtend = require('xtend');
var moment = require('moment');
var DynamoStore = module.exports = function (db, tablename, options) {
AbstractClientStore.apply(this, arguments);
this.options = xtend({}, DynamoStore.defaults, options);
this.db = db;
this.storeTable = tablename;
};
DynamoStore.prototype = Object.create(AbstractClientStore.prototype);
DynamoStore.prototype.set = function (key, value, lifetime, callback) {
var storeKey = this.options.prefix+key;
var expiration = lifetime ? (moment().add('seconds', lifetime).toDate()).getTime() : undefined;
this.db.updateItem({
Key: {
"storeKey": { "S": storeKey}
},
ExpressionAttributeValues: {
":brutedata": { "S": JSON.stringify(value)},
":expires": { "N": expiration.toString()}
},
UpdateExpression: "SET brutedata = :brutedata, expires = :expires",
TableName : this.storeTable
}, function (err, doc) {
if(err) {
typeof callback == 'function' && callback(err, null);
}
else {
typeof callback == 'function' && callback.apply(this, arguments);
}
});
};
DynamoStore.prototype.get = function (key, callback) {
var storeKey = this.options.prefix+key;
this.db.getItem({
Key: {
"storeKey": { "S" : storeKey}
},
TableName : this.storeTable
}, function(err, doc) {
if (err) {
typeof callback == 'function' && callback(err, null);
} else {
var brutedata;
if (doc.Item && doc.Item.expires.N < new Date().getTime()) {
db.deleteItem({
Key: {
"storeKey": {"S": storeKey}
},
TableName: this.storeTable
});
}
if (doc.Item) {
brutedata = JSON.parse(doc.Item.brutedata.S);
brutedata.lastRequest = new Date(brutedata.lastRequest);
brutedata.firstRequest = new Date(brutedata.firstRequest);
}
typeof callback == 'function' && callback(err, brutedata);
}
});
};
DynamoStore.prototype.clean = function() {
var timenow = new Date().getTime();
this.db.scan({
TableName: this.storeTable,
ExpressionAttributeValues:{
":timenow": {"N": timenow.toString()}
},
FilterExpression: "expires < :timenow",
ReturnConsumedCapacity: "TOTAL"
}, function(err, doc) {
if (err);
else {
var expireddata = doc.Items;
for (var p in expireddata) {
this.db.deleteItem({
Key: {
"storeKey": {"S": expireddata[p].storeKey.S}
},
TableName: this.storeTable
}, function (err, doc) {
if (err) ;
});
}
}
})
}
DynamoStore.prototype.reset = function (key, callback) {
var storeKey = this.options.prefix+key;
this.db.deleteItem({
Key: {
"storeKey": { "S": storeKey}
},
TableName : this.storeTable
}, function () {
typeof callback == 'function' && callback.apply(this, arguments);
});
};
DynamoStore.defaults = {
prefix: ''
};