/
tel-carrier.js
103 lines (88 loc) · 2.71 KB
/
tel-carrier.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
'use strict';
var request = require('request')
, allGateways
;
request.get('http://tel-carrier.coolaj86.com/gateways', function (err, req, data) {
try {
allGateways = JSON.parse(data);
} catch(e) {
// ignore
allGateways = {};
}
});
function updateRegistry(number, map, opts) {
opts = opts || {};
if (!allGateways) {
setTimeout(function () {
updateRegistry(number, map, opts);
}, 500);
return;
}
var data = { carriers: {}, numbers: {} }
;
if ((map.smsGateway && !(allGateways[map.carrier]||{}).sms) || (map.mmsGateway && !(allGateways[map.carrier]||{}).mms)) {
data.carriers[map.carrier] = { sms: (map.smsGateway||'').replace(/.*@/, ''), mms: (map.mmsGateway||'').replace(/.*@/, '') };
}
data.numbers[number] = { wireless: map.wireless, carrier: map.carrier };
if (false === opts.authoritative) {
delete data.carriers;
delete data.numbers[number].carrier;
delete data.numbers[number].wireless;
}
if (data.carriers) {
allGateways[map.carrier] = data.carriers[map.carrier];
}
request.post('http://tel-carrier.coolaj86.com/analytics', { json: data }, function (/*err, req, data*/) {
// ignore
});
}
module.exports.create = function (opts) {
var jar = request.jar()
, services
, service
;
services = require('./services');
service = services[opts.service];
// TODO move
function normalize(number, map/*, opts*/) {
map.number = '+1' + /(?=\+?1)?(\d{10})$/.exec(String(map.number))[1];
if (map.smsGateway) {
map.smsGateway = map.number.replace(/^\+1/, '') + map.smsGateway.replace(/.*@/, '@');
}
if (map.mmsGateway) {
map.mmsGateway = map.number.replace(/^\+1/, '') + map.mmsGateway.replace(/.*@/, '@');
}
return map;
}
function normalizeNum(number) {
return String(number).replace(/(?=\+?1)?(\d{10})$/, '$1');
}
return {
lookup: function (numbers, fn, pre, post) {
if (!Array.isArray(numbers)) {
service = service.one || service;
numbers = normalizeNum(numbers);
} else {
service = service.many;
numbers.forEach(function (n, i) {
numbers[i] = normalizeNum(n);
});
numbers = numbers.filter(function (n) { return n; });
}
service(request, jar, numbers, opts, function (err, maps, opts) {
if (!Array.isArray(numbers)) {
if (maps && maps.carrier) {
maps = normalize(numbers, maps, opts);
updateRegistry(numbers, maps, opts);
}
} else {
numbers.forEach(function (n, i) {
maps[i] = normalize(n, maps[i], opts);
updateRegistry(n, maps[i], opts);
});
}
fn(err, maps);
}, pre, post);
}
};
};