Commit a21e7a161eb3b8eeb6e6885d17887b2f29ce635f

Authored by Adhidarma Hadiwinoto
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

... ... @@ -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 }
... ... @@ -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
... ... @@ -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 });