Commit a21e7a161eb3b8eeb6e6885d17887b2f29ce635f
1 parent
f031376361
Exists in
master
modem-chooser for sending message
Showing 4 changed files with 73 additions and 2 deletions Side-by-side Diff
config.sample.json
... | ... | @@ -35,6 +35,20 @@ |
35 | 35 | "SMS1" |
36 | 36 | ], |
37 | 37 | |
38 | + "imsi_senders": { | |
39 | + "prefix_names": { | |
40 | + "TELKOMSEL": [ | |
41 | + "510890944235402" | |
42 | + ], | |
43 | + "XL": [ | |
44 | + "510890944262917" | |
45 | + ] | |
46 | + }, | |
47 | + "default": [ | |
48 | + "510890944235513" | |
49 | + ] | |
50 | + }, | |
51 | + | |
38 | 52 | "redis": { |
39 | 53 | "host": "127.0.0.1" |
40 | 54 | } |
index.js
... | ... | @@ -10,6 +10,9 @@ const config = require('komodo-sdk/config'); |
10 | 10 | global.KOMODO_LOG_LABEL = `KOMODO-CENTER@${(config && typeof config.name === 'string') ? config.name.toUpperCase() : 'SMS'}`; |
11 | 11 | process.title = global.KOMODO_LOG_LABEL; |
12 | 12 | |
13 | +const logger = require('komodo-sdk/logger'); | |
14 | +global.KOMODO_LOGGER = logger; | |
15 | + | |
13 | 16 | require('./lib/prefixes'); |
14 | 17 | require('./lib/transport'); |
15 | 18 | require('./lib/apiserver'); |
lib/modem-chooser.js
... | ... | @@ -0,0 +1,52 @@ |
1 | +'use strict'; | |
2 | + | |
3 | +const prefixes = require('./prefixes'); | |
4 | +const modems = require('./modems2'); | |
5 | +const partnerLastSeen = require('./partner-last-seen'); | |
6 | + | |
7 | +function filterOutCandidates(candidates) { | |
8 | + if (!Array.isArray(candidates)) { | |
9 | + return []; | |
10 | + } | |
11 | + | |
12 | + return candidates.filter((item) => { | |
13 | + const modem = modems.get('by_imsi', item); | |
14 | + | |
15 | + if (!modem) return false; | |
16 | + return true; | |
17 | + }); | |
18 | +} | |
19 | + | |
20 | +exports.chooser = async function chooser(destination, config) { | |
21 | + const logger = global.KOMODO_LOGGER; | |
22 | + | |
23 | + const prefixName = await prefixes.lookup(destination); | |
24 | + if (logger) logger.verbose('Choosing suitable senders', { destination, prefixName }); | |
25 | + | |
26 | + let imsiSenders = []; | |
27 | + if (config.imsi_senders && config.imsi_senders.prefix_names && config.imsi_senders.prefix_names[prefixName]) { | |
28 | + imsiSenders = filterOutCandidates(config.imsi_senders.prefix_names[prefixName]); | |
29 | + if (logger) logger.verbose('Suitable senders by prefix name', { destination, prefixName, imsiSenders }); | |
30 | + } | |
31 | + | |
32 | + if (!imsiSenders.length && config.imsi_senders.default && Array.isArray(config.imsi_senders.default) && config.imsi_senders.default.length) { | |
33 | + imsiSenders = filterOutCandidates(config.imsi_senders.default); | |
34 | + if (logger) logger.verbose('Suitable default senders', { destination, prefixName, imsiSenders }); | |
35 | + } | |
36 | + | |
37 | + if (!imsiSenders.length) { | |
38 | + imsiSenders = filterOutCandidates([ await partnerLastSeen.get(destination) ]); | |
39 | + if (logger) logger.verbose('Suitable senders by last seen', { destination, prefixName, imsiSenders }); | |
40 | + } | |
41 | + | |
42 | + if (!imsiSenders.length) { | |
43 | + if (logger) logger.verbose('No suitable sender found', { destination, prefixName }); | |
44 | + return; | |
45 | + } | |
46 | + | |
47 | + const count = imsiSenders.length; | |
48 | + const idx = Math.round(Math.random() * (count - 1)); | |
49 | + const imsiChoosed = imsiSenders[idx]; | |
50 | + if (logger) logger.verbose(`Choose modem with IMSI ${imsiChoosed}`, { destination, prefixName, imsiSenders }); | |
51 | + return imsiChoosed; | |
52 | +} | |
0 | 53 | \ No newline at end of file |
lib/transport.js
... | ... | @@ -14,7 +14,8 @@ const messagingService = require('komodo-center-messaging-client-lib'); |
14 | 14 | |
15 | 15 | const common = require('./common'); |
16 | 16 | const modems = require('./modems2'); |
17 | -const partnerLastSeen = require('./partner-last-seen'); | |
17 | +const modemChooser = require('./modem-chooser'); | |
18 | +// const partnerLastSeen = require('./partner-last-seen'); | |
18 | 19 | const history = require('./history'); |
19 | 20 | const prefixes = require('./prefixes'); |
20 | 21 | |
... | ... | @@ -119,7 +120,8 @@ async function send(partner, msg) { |
119 | 120 | logger.verbose('Destination number prefix lookup', {partner: destinationNumber, prefix: prefixName}); |
120 | 121 | |
121 | 122 | // logger.verbose('Choosing handler name', { partner, destinationNumber, msg, origin }); |
122 | - const handlerIMSI = await partnerLastSeen.get(destinationNumber) ; | |
123 | + // const handlerIMSI = await partnerLastSeen.get(destinationNumber) ; | |
124 | + const handlerIMSI = await modemChooser.chooser(destinationNumber, config); | |
123 | 125 | |
124 | 126 | if (!handlerIMSI) { |
125 | 127 | logger.warn(`Unknown handler for sending message to partner`, { partner, destinationNumber }); |