-
Notifications
You must be signed in to change notification settings - Fork 0
/
utils.js
executable file
·137 lines (111 loc) · 2.49 KB
/
utils.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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
const path = require('path');
const PROCEED = 1;
const ALREADY_APPLIED = 2;
const HALT = -1;
const WINDOW_REGEX = /^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}([.0-9]*)/;
class RTime {
constructor (time_str) {
this.time_str = time_str;
this.window = this.calcWindow();
this.date = new Date(this.time_str);
}
calcWindow() {
const match = WINDOW_REGEX.exec(this.time_str);
if(match[1] === '') {
return 1;
} else {
const decimal_length = match[1].length - 1;
if(decimal_length > 3) {
return 0.001;
} else {
return 1 / Math.pow(10, decimal_length);
}
}
}
equals(other_time) {
if(other_time instanceof RUnsupportedTime) {
return true;
}
let compare_window = this.window;
if(other_time.window > compare_window) {
compare_window = other_time.window;
}
const dt = (this.date.getTime() - other_time.date.getTime()) / 1000;
return (dt < compare_window && dt > -compare_window);
}
toJSON() {
return this.time_str;
}
}
class RUnsupportedTime {
constructor (time_str) {
this.time_str = time_str;
}
equals(other_time) {
return true;
}
toJSON() {
return this.time_str;
}
}
function db_next(leveldown_iterator) {
return new Promise((resolve,reject) => {
const cb = (err,key,value) => {
if(err) {
reject(err);
} else {
if(key === undefined && value === undefined) {
resolve(undefined);
} else {
resolve({key, value});
}
}
};
leveldown_iterator.next(cb);
});
}
async function* db_iterate(db) {
const iter = db.iterator();
try {
while(true) {
let value = await db_next(iter);
if(value === undefined) {
break;
}
yield value;
}
} finally {
iter.end(_ => {});
}
return;
}
async function level_get(db, key) {
let value = undefined;
try {
value = await db.get(key);
} catch(err) {}
return value;
}
function dirname(full) {
let name = path.dirname(full);
if(name === ".") {
name = "";
}
return name;
}
function join(path1, path2) {
let sep = "/";
if(path1 === '' || path1.endsWith(':')) {
sep = '';
}
return `${path1}${sep}${path2}`;
}
exports.level_get = level_get;
exports.dirname = dirname;
exports.join = join;
exports.RTime = RTime;
exports.RUnsupportedTime = RUnsupportedTime;
exports.db_iterate = db_iterate;
exports.PROCEED = PROCEED;
exports.ALREADY_APPLIED = ALREADY_APPLIED;
exports.HALT = HALT;