forked from PRX/prx-podagent
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathindex.js
66 lines (62 loc) · 1.4 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
const fs = require('fs');
const yaml = require('js-yaml');
const TAGS = ['name', 'type', 'os'];
/**
* Sync parse a user agent string
*/
exports.parse = (agentStr, callback) => {
if (callback) {
exports.load(err => {
if (err) {
callback(err);
} else {
callback(null, findAgent(agentStr));
}
});
} else {
exports.load();
return findAgent(agentStr);
}
}
/**
* Load the agents database
*/
let DB = false;
exports.load = (callback) => {
if (DB) {
callback && callback();
} else if (callback) {
fs.readFile(`${__dirname}/db/agents.lock.yml`, (err, text) => {
parseAgents(text);
callback(err);
});
} else {
parseAgents(fs.readFileSync(`${__dirname}/db/agents.lock.yml`, 'utf8'));
}
}
/**
* Build regex from strings
*/
function parseAgents(text) {
let data = yaml.safeLoad(text) || {};
let agents = data.agents || [];
let tagLookup = data.tags || [];
DB = agents.map(agent => {
if (agent.caseInsensitive) {
agent.regex = new RegExp(agent.regex, 'i');
} else {
agent.regex = new RegExp(agent.regex);
}
TAGS.forEach(t => {
agent[`${t}Id`] = parseInt(agent[t]) || null;
agent[t] = tagLookup[agent[t]] || null;
});
return agent;
});
}
/**
* Find and agent in the database
*/
function findAgent(agentStr) {
return DB.find(agent => agent.regex.test(agentStr)) || null;
}