diff --git a/config.sample.json b/config.sample.json index c69dbec..6dd0940 100644 --- a/config.sample.json +++ b/config.sample.json @@ -35,6 +35,20 @@ "SMS1" ], + "imsi_senders": { + "prefix_names": { + "TELKOMSEL": [ + "510890944235402" + ], + "XL": [ + "510890944262917" + ] + }, + "default": [ + "510890944235513" + ] + }, + "redis": { "host": "127.0.0.1" } diff --git a/index.js b/index.js index a23868f..82d8187 100644 --- a/index.js +++ b/index.js @@ -10,6 +10,9 @@ const config = require('komodo-sdk/config'); global.KOMODO_LOG_LABEL = `KOMODO-CENTER@${(config && typeof config.name === 'string') ? config.name.toUpperCase() : 'SMS'}`; process.title = global.KOMODO_LOG_LABEL; +const logger = require('komodo-sdk/logger'); +global.KOMODO_LOGGER = logger; + require('./lib/prefixes'); require('./lib/transport'); require('./lib/apiserver'); diff --git a/lib/modem-chooser.js b/lib/modem-chooser.js new file mode 100644 index 0000000..f5b340a --- /dev/null +++ b/lib/modem-chooser.js @@ -0,0 +1,52 @@ +'use strict'; + +const prefixes = require('./prefixes'); +const modems = require('./modems2'); +const partnerLastSeen = require('./partner-last-seen'); + +function filterOutCandidates(candidates) { + if (!Array.isArray(candidates)) { + return []; + } + + return candidates.filter((item) => { + const modem = modems.get('by_imsi', item); + + if (!modem) return false; + return true; + }); +} + +exports.chooser = async function chooser(destination, config) { + const logger = global.KOMODO_LOGGER; + + const prefixName = await prefixes.lookup(destination); + if (logger) logger.verbose('Choosing suitable senders', { destination, prefixName }); + + let imsiSenders = []; + if (config.imsi_senders && config.imsi_senders.prefix_names && config.imsi_senders.prefix_names[prefixName]) { + imsiSenders = filterOutCandidates(config.imsi_senders.prefix_names[prefixName]); + if (logger) logger.verbose('Suitable senders by prefix name', { destination, prefixName, imsiSenders }); + } + + if (!imsiSenders.length && config.imsi_senders.default && Array.isArray(config.imsi_senders.default) && config.imsi_senders.default.length) { + imsiSenders = filterOutCandidates(config.imsi_senders.default); + if (logger) logger.verbose('Suitable default senders', { destination, prefixName, imsiSenders }); + } + + if (!imsiSenders.length) { + imsiSenders = filterOutCandidates([ await partnerLastSeen.get(destination) ]); + if (logger) logger.verbose('Suitable senders by last seen', { destination, prefixName, imsiSenders }); + } + + if (!imsiSenders.length) { + if (logger) logger.verbose('No suitable sender found', { destination, prefixName }); + return; + } + + const count = imsiSenders.length; + const idx = Math.round(Math.random() * (count - 1)); + const imsiChoosed = imsiSenders[idx]; + if (logger) logger.verbose(`Choose modem with IMSI ${imsiChoosed}`, { destination, prefixName, imsiSenders }); + return imsiChoosed; +} \ No newline at end of file diff --git a/lib/transport.js b/lib/transport.js index 0e496f0..cea6f8a 100644 --- a/lib/transport.js +++ b/lib/transport.js @@ -14,7 +14,8 @@ const messagingService = require('komodo-center-messaging-client-lib'); const common = require('./common'); const modems = require('./modems2'); -const partnerLastSeen = require('./partner-last-seen'); +const modemChooser = require('./modem-chooser'); +// const partnerLastSeen = require('./partner-last-seen'); const history = require('./history'); const prefixes = require('./prefixes'); @@ -119,7 +120,8 @@ async function send(partner, msg) { logger.verbose('Destination number prefix lookup', {partner: destinationNumber, prefix: prefixName}); // logger.verbose('Choosing handler name', { partner, destinationNumber, msg, origin }); - const handlerIMSI = await partnerLastSeen.get(destinationNumber) ; + // const handlerIMSI = await partnerLastSeen.get(destinationNumber) ; + const handlerIMSI = await modemChooser.chooser(destinationNumber, config); if (!handlerIMSI) { logger.warn(`Unknown handler for sending message to partner`, { partner, destinationNumber });