-
Notifications
You must be signed in to change notification settings - Fork 0
/
Backlog.js
121 lines (110 loc) · 2.75 KB
/
Backlog.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
111
112
113
114
115
116
117
118
119
120
121
var levelup = require('level');
function Backlog(dbname) {
this.db = levelup(dbname);
// other than these properties,
// this object is a dict of canary messages
}
Backlog.prototype.contains = backlogContains;
Backlog.prototype.values = backlogValues;
Backlog.prototype.keys = backlogKeys;
Backlog.prototype.close = backlogClose;
Backlog.prototype.add = backlogAdd;
Backlog.prototype.getAll = backlogGetAll;
Backlog.prototype.getLatest = backlogGetLatest;
function backlogKeys() {
return this.db.createKeyStream();
}
function backlogValues() {
return this.db.createValueStream();
}
// cb(err, bool contains)
function backlogContains(message, cb) {
var contains = false;
this.values().
on('data', function(data) {
if(data === message)
contains = true;
}).on('error', function(err) {
cb({
name : err.name,
message : err.message
});
}).on('end', function() {
cb(null, contains);
});
}
// cb(err, int time)
function backlogAdd(entry, cb) {
var now = Date.now();
var self = this;
this.db.get(now, function(err, val) {
if(err.notFound)
return self.db.put(now, entry, function(err) {
if(err)
return cb({
name : err.name,
message : err.message
});
cb(null, now);
});
if(err)
return cb({
name : err.name,
message : err.message
});
if(val)
return cb({
name : "TimeError",
message : "Temporal anomaly."
});
cb({
name : "ExoticCircumstanceError",
message : "Edge case in Backlog.add"
});
});
}
// cb(err, Array array)
function backlogGetAll(cb) {
var array = [];
this.db.createReadStream().
on('data', function(data) {
array.push(data);
}).on('error', function(err) {
cb({
name : err.name,
message : err.message
});
}).on('end', function() {
cb(null, array);
});
}
// cb(err, int time, String result)
function backlogGetLatest(cb) {
var result = 0;
var self = this;
this.keys().
on('data', function(data) {
var num = parseInt(data);
if(num > result)
result = num;
}).on('error', function(err) {
cb({
name : err.name,
message : err.message
});
}).on('end', function() {
if(result > 0)
self.db.get(result, function(err, value) {
if(err)
return cb({
name : err.name,
message : err.message
});
cb(null, result, value);
});
});
}
function backlogClose(cb) {
this.db.close(cb);
}
module.exports = Backlog;