Commit 4a81b13bb0289ca5c389c33ff0bdbe9e32719f09

Authored by Adhidarma Hadiwinoto
1 parent f2d51eef9e
Exists in master

Modem chooser optimizer

Showing 1 changed file with 12 additions and 8 deletions Inline Diff

lib/modem-chooser.js
1 'use strict'; 1 'use strict';
2 2
3 const prefixes = require('./prefixes'); 3 const prefixes = require('./prefixes');
4 const modems = require('./modems2'); 4 const modems = require('./modems2');
5 const partnerLastSeen = require('./partner-last-seen'); 5 const partnerLastSeen = require('./partner-last-seen');
6 6
7 function filterOutCandidates(candidates) { 7 function filterOutCandidates(candidates) {
8 if (!Array.isArray(candidates)) { 8 if (!Array.isArray(candidates)) {
9 return []; 9 return [];
10 } 10 }
11 11
12 return candidates.filter((item) => { 12 return candidates.filter((item) => {
13 if (item.indexOf('#') >= 0) return false; 13 if (item.indexOf('#') >= 0) return false;
14 14
15 const modem = modems.get('by_imsi', item); 15 const modem = modems.get('by_imsi', item);
16 if (!modem) return false; 16 if (!modem) return false;
17 17
18 return true; 18 return true;
19 }); 19 });
20 } 20 }
21 21
22 exports.chooser = async function chooser(destination, config) { 22 exports.chooser = async function chooser(destination, config) {
23 const logger = global.KOMODO_LOGGER; 23 const logger = global.KOMODO_LOGGER;
24 24
25 const prefixName = await prefixes.lookup(destination); 25 let prefixName = await prefixes.lookup(destination);
26 if (logger) logger.verbose('Choosing suitable senders', { destination, prefixName }); 26 if (typeof prefixName === 'string') {
27 prefixName = prefixName.toUpperCase();
28 }
29
30 if (logger) logger.verbose('MODEM-CHOOSER: Choosing suitable senders', { destination, prefixName });
27 31
28 let imsiSenders = []; 32 let imsiSenders = [];
29 if (config.imsi_senders && config.imsi_senders.prefix_names && config.imsi_senders.prefix_names[prefixName]) { 33 if (config.imsi_senders && prefixName && config.imsi_senders.prefix_names && config.imsi_senders.prefix_names[prefixName]) {
30 imsiSenders = filterOutCandidates(config.imsi_senders.prefix_names[prefixName]); 34 imsiSenders = filterOutCandidates(config.imsi_senders.prefix_names[prefixName]);
31 if (logger) logger.verbose('Suitable senders by prefix name', { destination, prefixName, imsiSenders }); 35 if (logger) logger.verbose('MODEM-CHOOSER: Try to use imsi senders by prefix name', { destination, prefixName, imsiSenders });
32 } 36 }
33 37
34 if (!imsiSenders.length && config.imsi_senders.default && Array.isArray(config.imsi_senders.default) && config.imsi_senders.default.length) { 38 if (!imsiSenders.length && config.imsi_senders.default && Array.isArray(config.imsi_senders.default) && config.imsi_senders.default.length) {
35 imsiSenders = filterOutCandidates(config.imsi_senders.default); 39 imsiSenders = filterOutCandidates(config.imsi_senders.default);
36 if (logger) logger.verbose('Suitable default senders', { destination, prefixName, imsiSenders }); 40 if (logger) logger.verbose('MODEM-CHOOSER: Try to use default senders', { destination, prefixName, imsiSenders });
37 } 41 }
38 42
39 if (!imsiSenders.length) { 43 if (!imsiSenders.length) {
40 imsiSenders = filterOutCandidates([ await partnerLastSeen.get(destination) ]); 44 imsiSenders = filterOutCandidates([ await partnerLastSeen.get(destination) ]);
41 if (logger) logger.verbose('Suitable senders by last seen', { destination, prefixName, imsiSenders }); 45 if (logger) logger.verbose('MODEM-CHOOSER: Try to use sender by last seen', { destination, prefixName, imsiSenders });
42 } 46 }
43 47
44 if (!imsiSenders.length) { 48 if (!imsiSenders.length) {
45 if (logger) logger.verbose('No suitable sender found', { destination, prefixName }); 49 if (logger) logger.warn('MODEM-CHOOSER: No suitable sender found', { destination, prefixName });
46 return; 50 return;
47 } 51 }
48 52
49 const count = imsiSenders.length; 53 const count = imsiSenders.length;
50 const idx = Math.round(Math.random() * (count - 1)); 54 const idx = Math.round(Math.random() * (count - 1));
51 const imsiChoosed = imsiSenders[idx]; 55 const imsiChoosed = imsiSenders[idx];
52 56
53 if (logger) logger.verbose(`Choose modem with IMSI ${imsiChoosed}`, { destination, prefixName, imsiSenders }); 57 if (logger) logger.verbose(`MODEM-CHOOSER: gonna use modem with IMSI ${imsiChoosed}`, { destination, prefixName, imsiSenders });
54 58
55 return imsiChoosed; 59 return imsiChoosed;
56 } 60 }