Commit e5065a9b61f2a6adc21a9cd5bfe5d18b4e9ff18e
1 parent
c75a88136f
Exists in
master
MODEM-CHOOSER: bugfix
Showing 1 changed file with 3 additions and 0 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 | if (!candidates.length) return []; | ||
13 | |||
12 | return candidates.filter((item) => { | 14 | return candidates.filter((item) => { |
15 | if (typeof item !== 'string') return false; | ||
13 | if (item.indexOf('#') >= 0) return false; | 16 | if (item.indexOf('#') >= 0) return false; |
14 | 17 | ||
15 | const modem = modems.get('by_imsi', item); | 18 | const modem = modems.get('by_imsi', item); |
16 | if (!modem) return false; | 19 | if (!modem) return false; |
17 | 20 | ||
18 | return true; | 21 | return true; |
19 | }); | 22 | }); |
20 | } | 23 | } |
21 | 24 | ||
22 | exports.chooser = async function chooser(destination, config) { | 25 | exports.chooser = async function chooser(destination, config) { |
23 | const logger = global.KOMODO_LOGGER; | 26 | const logger = global.KOMODO_LOGGER; |
24 | 27 | ||
25 | let prefixName = await prefixes.lookup(destination); | 28 | let prefixName = await prefixes.lookup(destination); |
26 | if (typeof prefixName === 'string') { | 29 | if (typeof prefixName === 'string') { |
27 | prefixName = prefixName.toUpperCase(); | 30 | prefixName = prefixName.toUpperCase(); |
28 | } | 31 | } |
29 | 32 | ||
30 | if (logger) logger.verbose('MODEM-CHOOSER: Choosing suitable senders', { destination, prefixName }); | 33 | if (logger) logger.verbose('MODEM-CHOOSER: Choosing suitable senders', { destination, prefixName }); |
31 | 34 | ||
32 | let imsiSenders = []; | 35 | let imsiSenders = []; |
33 | if (config.imsi_senders && prefixName && config.imsi_senders.prefix_names && config.imsi_senders.prefix_names[prefixName]) { | 36 | if (config.imsi_senders && prefixName && config.imsi_senders.prefix_names && config.imsi_senders.prefix_names[prefixName]) { |
34 | imsiSenders = filterOutCandidates(config.imsi_senders.prefix_names[prefixName]); | 37 | imsiSenders = filterOutCandidates(config.imsi_senders.prefix_names[prefixName]); |
35 | if (logger) logger.verbose('MODEM-CHOOSER: Try to use imsi senders by prefix name', { destination, prefixName, imsiSenders }); | 38 | if (logger) logger.verbose('MODEM-CHOOSER: Try to use imsi senders by prefix name', { destination, prefixName, imsiSenders }); |
36 | } | 39 | } |
37 | 40 | ||
38 | if (!imsiSenders.length && config.imsi_senders && config.imsi_senders.unknown_prefix) { | 41 | if (!imsiSenders.length && config.imsi_senders && config.imsi_senders.unknown_prefix) { |
39 | imsiSenders = filterOutCandidates(config.imsi_senders.unknown_prefix); | 42 | imsiSenders = filterOutCandidates(config.imsi_senders.unknown_prefix); |
40 | if (logger) logger.verbose('MODEM-CHOOSER: Try to use senders for unknown prefix', { destination, prefixName, imsiSenders }); | 43 | if (logger) logger.verbose('MODEM-CHOOSER: Try to use senders for unknown prefix', { destination, prefixName, imsiSenders }); |
41 | } | 44 | } |
42 | 45 | ||
43 | if (!imsiSenders.length) { | 46 | if (!imsiSenders.length) { |
44 | imsiSenders = filterOutCandidates([ await partnerLastSeen.get(destination) ]); | 47 | imsiSenders = filterOutCandidates([ await partnerLastSeen.get(destination) ]); |
45 | if (logger) logger.verbose('MODEM-CHOOSER: Try to use sender by last seen', { destination, prefixName, imsiSenders }); | 48 | if (logger) logger.verbose('MODEM-CHOOSER: Try to use sender by last seen', { destination, prefixName, imsiSenders }); |
46 | } | 49 | } |
47 | 50 | ||
48 | if (!imsiSenders.length && config.imsi_senders && config.imsi_senders.default) { | 51 | if (!imsiSenders.length && config.imsi_senders && config.imsi_senders.default) { |
49 | imsiSenders = filterOutCandidates(config.imsi_senders.default); | 52 | imsiSenders = filterOutCandidates(config.imsi_senders.default); |
50 | if (logger) logger.verbose('MODEM-CHOOSER: Try to use default senders', { destination, prefixName, imsiSenders }); | 53 | if (logger) logger.verbose('MODEM-CHOOSER: Try to use default senders', { destination, prefixName, imsiSenders }); |
51 | } | 54 | } |
52 | 55 | ||
53 | 56 | ||
54 | if (!imsiSenders.length) { | 57 | if (!imsiSenders.length) { |
55 | if (logger) logger.warn('MODEM-CHOOSER: No suitable sender found', { destination, prefixName }); | 58 | if (logger) logger.warn('MODEM-CHOOSER: No suitable sender found', { destination, prefixName }); |
56 | return; | 59 | return; |
57 | } | 60 | } |
58 | 61 | ||
59 | const count = imsiSenders.length; | 62 | const count = imsiSenders.length; |
60 | const idx = Math.round(Math.random() * (count - 1)); | 63 | const idx = Math.round(Math.random() * (count - 1)); |
61 | const imsiChoosed = imsiSenders[idx]; | 64 | const imsiChoosed = imsiSenders[idx]; |
62 | 65 | ||
63 | if (logger) logger.verbose(`MODEM-CHOOSER: gonna use modem with IMSI ${imsiChoosed}`, { destination, prefixName, imsiSenders }); | 66 | if (logger) logger.verbose(`MODEM-CHOOSER: gonna use modem with IMSI ${imsiChoosed}`, { destination, prefixName, imsiSenders }); |
64 | 67 | ||
65 | return imsiChoosed; | 68 | return imsiChoosed; |
66 | } | 69 | } |