Commit 1c0e584d5856c03f93bf79d53c1bdf77d68ad885
1 parent
2e601f8db9
Exists in
master
MODEM-CHOOSER handler imsi as number
Showing 1 changed file with 6 additions and 2 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 | const logger = global.KOMODO_LOGGER; | 8 | const logger = global.KOMODO_LOGGER; |
9 | 9 | ||
10 | if (!Array.isArray(candidates)) { | 10 | if (!Array.isArray(candidates)) { |
11 | return []; | 11 | return []; |
12 | } | 12 | } |
13 | 13 | ||
14 | if (!candidates.length) return []; | 14 | if (!candidates.length) return []; |
15 | 15 | ||
16 | const filtered = candidates.filter((item) => { | 16 | const filtered = candidates.filter((item) => { |
17 | if (typeof item === 'number') { | ||
18 | item = item.toString(); | ||
19 | } | ||
20 | |||
17 | if (typeof item !== 'string') { | 21 | if (typeof item !== 'string') { |
18 | if (logger) logger.warn(`MODEM-CHOOSER: typeof item is ${ typeof item }, not a string`); | 22 | if (logger) logger.warn(`MODEM-CHOOSER: typeof item is ${ typeof item }, not a string or a number`); |
19 | return false; | 23 | return false; |
20 | } | 24 | } |
21 | 25 | ||
22 | if (item.indexOf('#') >= 0) { | 26 | if (item.indexOf('#') >= 0) { |
23 | if (logger) logger.warn('MODEM-CHOOSER: candidate has #, ignoring'); | 27 | if (logger) logger.warn('MODEM-CHOOSER: candidate has #, ignoring'); |
24 | return false; | 28 | return false; |
25 | } | 29 | } |
26 | 30 | ||
27 | const modem = modems.get('imsi', item); | 31 | const modem = modems.get('imsi', item); |
28 | if (!modem) { | 32 | if (!modem) { |
29 | if (logger) logger.verbose(`MODEM-CHOOSER: No modem with IMSI ${item} found, removing from candidates`); | 33 | if (logger) logger.verbose(`MODEM-CHOOSER: No modem with IMSI ${item} found, removing from candidates`); |
30 | return false; | 34 | return false; |
31 | } | 35 | } |
32 | 36 | ||
33 | return true; | 37 | return true; |
34 | }); | 38 | }); |
35 | 39 | ||
36 | if (logger) logger.verbose('MODEM-CHOOSER: Senders candidates reduced', { candidates, filtered }); | 40 | if (logger) logger.verbose('MODEM-CHOOSER: Senders candidates reduced', { candidates, filtered }); |
37 | return filtered; | 41 | return filtered; |
38 | } | 42 | } |
39 | 43 | ||
40 | exports.chooser = async function chooser(destination, config) { | 44 | exports.chooser = async function chooser(destination, config) { |
41 | const logger = global.KOMODO_LOGGER; | 45 | const logger = global.KOMODO_LOGGER; |
42 | 46 | ||
43 | let prefixName = await prefixes.lookup(destination); | 47 | let prefixName = await prefixes.lookup(destination); |
44 | if (typeof prefixName === 'string') { | 48 | if (typeof prefixName === 'string') { |
45 | prefixName = prefixName.toUpperCase(); | 49 | prefixName = prefixName.toUpperCase(); |
46 | } | 50 | } |
47 | 51 | ||
48 | if (logger) logger.verbose('MODEM-CHOOSER: Choosing suitable senders', { destination, prefixName }); | 52 | if (logger) logger.verbose('MODEM-CHOOSER: Choosing suitable senders', { destination, prefixName }); |
49 | 53 | ||
50 | let sendersImsi = []; | 54 | let sendersImsi = []; |
51 | if (config.senders_imsi && prefixName && config.senders_imsi.prefix_names && config.senders_imsi.prefix_names[prefixName]) { | 55 | if (config.senders_imsi && prefixName && config.senders_imsi.prefix_names && config.senders_imsi.prefix_names[prefixName]) { |
52 | sendersImsi = filterOutCandidates(config.senders_imsi.prefix_names[prefixName]); | 56 | sendersImsi = filterOutCandidates(config.senders_imsi.prefix_names[prefixName]); |
53 | if (logger) logger.verbose('MODEM-CHOOSER: Try to use imsi senders by prefix name', { destination, prefixName, sendersImsi, candidates: config.senders_imsi.prefix_names[prefixName] }); | 57 | if (logger) logger.verbose('MODEM-CHOOSER: Try to use imsi senders by prefix name', { destination, prefixName, sendersImsi, candidates: config.senders_imsi.prefix_names[prefixName] }); |
54 | } | 58 | } |
55 | 59 | ||
56 | if (!sendersImsi.length && config.senders_imsi && config.senders_imsi.unknown_prefix) { | 60 | if (!sendersImsi.length && config.senders_imsi && config.senders_imsi.unknown_prefix) { |
57 | sendersImsi = filterOutCandidates(config.senders_imsi.unknown_prefix); | 61 | sendersImsi = filterOutCandidates(config.senders_imsi.unknown_prefix); |
58 | if (logger) logger.verbose('MODEM-CHOOSER: Try to use senders for unknown prefix', { destination, prefixName, sendersImsi, candidates: config.senders_imsi.unknown_prefix }); | 62 | if (logger) logger.verbose('MODEM-CHOOSER: Try to use senders for unknown prefix', { destination, prefixName, sendersImsi, candidates: config.senders_imsi.unknown_prefix }); |
59 | } | 63 | } |
60 | 64 | ||
61 | if (!sendersImsi.length) { | 65 | if (!sendersImsi.length) { |
62 | sendersImsi = filterOutCandidates([ await partnerLastSeen.get(destination) ]); | 66 | sendersImsi = filterOutCandidates([ await partnerLastSeen.get(destination) ]); |
63 | if (logger) logger.verbose('MODEM-CHOOSER: Try to use sender by last seen', { destination, prefixName, sendersImsi }); | 67 | if (logger) logger.verbose('MODEM-CHOOSER: Try to use sender by last seen', { destination, prefixName, sendersImsi }); |
64 | } | 68 | } |
65 | 69 | ||
66 | if (!sendersImsi.length && config.senders_imsi && config.senders_imsi.default) { | 70 | if (!sendersImsi.length && config.senders_imsi && config.senders_imsi.default) { |
67 | sendersImsi = filterOutCandidates(config.senders_imsi.default); | 71 | sendersImsi = filterOutCandidates(config.senders_imsi.default); |
68 | if (logger) logger.verbose('MODEM-CHOOSER: Try to use default senders', { destination, prefixName, sendersImsi, candidates: config.senders_imsi.default }); | 72 | if (logger) logger.verbose('MODEM-CHOOSER: Try to use default senders', { destination, prefixName, sendersImsi, candidates: config.senders_imsi.default }); |
69 | } | 73 | } |
70 | 74 | ||
71 | if (!sendersImsi.length) { | 75 | if (!sendersImsi.length) { |
72 | if (logger) logger.warn('MODEM-CHOOSER: No suitable sender found', { destination, prefixName }); | 76 | if (logger) logger.warn('MODEM-CHOOSER: No suitable sender found', { destination, prefixName }); |
73 | return; | 77 | return; |
74 | } | 78 | } |
75 | 79 | ||
76 | const count = sendersImsi.length; | 80 | const count = sendersImsi.length; |
77 | const idx = Math.round(Math.random() * (count - 1)); | 81 | const idx = Math.round(Math.random() * (count - 1)); |
78 | const imsiChoosed = sendersImsi[idx]; | 82 | const imsiChoosed = sendersImsi[idx]; |
79 | 83 | ||
80 | if (logger) logger.verbose(`MODEM-CHOOSER: gonna use modem with IMSI ${imsiChoosed}`, { destination, prefixName, imsiSenders: sendersImsi }); | 84 | if (logger) logger.verbose(`MODEM-CHOOSER: gonna use modem with IMSI ${imsiChoosed}`, { destination, prefixName, imsiSenders: sendersImsi }); |
81 | 85 | ||
82 | return imsiChoosed; | 86 | return imsiChoosed; |
83 | } | 87 | } |