-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathzone.js
55 lines (52 loc) · 1.19 KB
/
zone.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
'use strict';
class Zone {
constructor(hosts, whitelist) {
this.root = {};
this.whitelist = whitelist;
this.hosts = Array.isArray(hosts) ? hosts : [hosts];
this.buildIndex();
}
buildIndex() {
const root = this.root;
this.whitelist
.map(domain => reverse(domain))
.sort()
.forEach(reversed => {
let words = reversed.split('.');
let subtree = root;
for (let w of words) {
if (!subtree[w]) {
subtree[w] = {__: 0};
subtree.__++;
}
subtree = subtree[w];
}
});
return root;
}
match(domain, exact = false) {
let subtree = this.root;
const reversedDomain = reverse(domain).split('.');
let matched = false;
for (let i = 0, m; m = reversedDomain[i]; i++) {
if (m in subtree) {
if (subtree[m].__ === 0) {
matched = exact ? !reversedDomain[i + 1] : true;
break;
} else {
subtree = subtree[m];
}
} else {
break;
}
}
return matched;
}
hosts() {
return this.hosts;
}
}
function reverse(domain) {
return domain.split('.').reverse().join('.')
}
module.exports = Zone;