Commit b01439988ee4ec046999b313dfb09fb7fbd73e1c

Authored by Adhidarma Hadiwinoto
1 parent 5a9e424b02
Exists in master

Debug

Showing 1 changed file with 1 additions and 1 deletions Inline Diff

1 "use strict"; 1 "use strict";
2 2
3 const request = require('request'); 3 const request = require('request');
4 const uuidv4 = require('uuid/v4'); 4 const uuidv4 = require('uuid/v4');
5 const moment = require('moment'); 5 const moment = require('moment');
6 6
7 const config = require('komodo-sdk/config'); 7 const config = require('komodo-sdk/config');
8 const logger = require('komodo-sdk/logger'); 8 const logger = require('komodo-sdk/logger');
9 9
10 const modems = require('./modems'); 10 const modems = require('./modems');
11 const partnerLastSeen = require('./partner-last-seen'); 11 const partnerLastSeen = require('./partner-last-seen');
12 const history = require('./history'); 12 const history = require('./history');
13 13
14 async function _getApproriateHandlerByLastSeen(partnerNumber) { 14 async function _getApproriateHandlerByLastSeen(partnerNumber) {
15 logger.verbose('Looking for last seen on for partner number ' + partnerNumber); 15 logger.verbose('Looking for last seen on for partner number ' + partnerNumber);
16 const lastSeenFrom = await partnerLastSeen.get(partnerNumber); 16 const lastSeenFrom = await partnerLastSeen.get(partnerNumber);
17 return lastSeenFrom; 17 return lastSeenFrom;
18 } 18 }
19 19
20 function _getApproriateHandlerByForced() { 20 function _getApproriateHandlerByForced() {
21 if (!config.sending_handler || !config.sending_handler.length) return; 21 if (!config.sending_handler || !config.sending_handler.length) return;
22 22
23 const sendingHandlerCount = config.sending_handler.length; 23 const sendingHandlerCount = config.sending_handler.length;
24 const idx = Math.floor(Math.random() * sendingHandlerCount); 24 const idx = Math.floor(Math.random() * sendingHandlerCount);
25 return config.sending_handler[idx]; 25 return config.sending_handler[idx];
26 } 26 }
27 27
28 async function _getApproriateHandler(partnerNumber, origin) { 28 async function _getApproriateHandler(partnerNumber, origin) {
29 let handlerToUse; 29 let handlerToUse;
30 30
31 if (config.handler_chooser_algorithm === 'FORCED') { 31 if (config.handler_chooser_algorithm === 'FORCED') {
32 handlerToUse = _getApproriateHandlerByForced(); 32 handlerToUse = _getApproriateHandlerByForced();
33 logger.verbose('Config file mentioned to using FORCED handler chooser algorithm', { handler_to_use: handlerToUse}); 33 logger.verbose('Config file mentioned to using FORCED handler chooser algorithm', { handler_to_use: handlerToUse});
34 } 34 }
35 else { 35 else {
36 handlerToUse = await _getApproriateHandlerByLastSeen(partnerNumber); 36 handlerToUse = await _getApproriateHandlerByLastSeen(partnerNumber);
37 logger.verbose('Config file mentioned to using LAST-SEEN handler chooser algorithm', { handler_to_use: handlerToUse}); 37 logger.verbose('Config file mentioned to using LAST-SEEN handler chooser algorithm', { handler_to_use: handlerToUse});
38 } 38 }
39 39
40 if (!modems.getModemConfig(handlerToUse, config.modems)) { 40 if (!modems.getModemConfig(handlerToUse, config.modems)) {
41 const handlerWithSameOrigin = modems.getModemConfig(origin, config.modems); 41 const handlerWithSameOrigin = modems.getModemConfig(origin, config.modems);
42 if (handlerWithSameOrigin) { 42 if (handlerWithSameOrigin) {
43 logger.verbose('Invalid approriate handler, using handler from the same ORIGIN request by CORE to send sms') 43 logger.verbose('Invalid approriate handler, using handler from the same ORIGIN request by CORE to send sms')
44 handlerToUse = origin; 44 handlerToUse = origin;
45 } 45 }
46 else { 46 else {
47 logger.verbose('Invalid approriate handler, using default handler to send sms') 47 logger.verbose('Invalid approriate handler, using default handler to send sms')
48 handlerToUse = config.default_modem; 48 handlerToUse = config.default_modem;
49 } 49 }
50 } 50 }
51 51
52 return handlerToUse; 52 return handlerToUse;
53 } 53 }
54 54
55 function _send(destinationNumber, msg, handlerName) { 55 function _send(destinationNumber, msg, handlerName) {
56 56
57 /* 57 /*
58 if (msg.length > 160 && !config.do_not_trim_long_sms) { 58 if (msg.length > 160 && !config.do_not_trim_long_sms) {
59 logger.verbose('Message trim to 160 chars'); 59 logger.verbose('Message trim to 160 chars');
60 msg = msg.slice(0, 156) + ' ...'; 60 msg = msg.slice(0, 156) + ' ...';
61 } 61 }
62 */ 62 */
63 63
64 if (msg.length > 160) { 64 if (msg.length > 160) {
65 const newMsg = msg.slice(0, 160); 65 const newMsg = msg.slice(0, 160);
66 const remainingMsg = msg.slice(160); 66 const remainingMsg = msg.slice(160);
67 67
68 _send(destinationNumber, newMsg, handlerName); 68 _send(destinationNumber, newMsg, handlerName);
69 setTimeout(() => { 69 setTimeout(() => {
70 _send(destinationNumber, remainingMsg, handlerName); 70 _send(destinationNumber, remainingMsg, handlerName);
71 }, 2000); 71 }, 2000);
72 72
73 return; 73 return;
74 } 74 }
75 75
76 const modem = modems.getModemConfig(handlerName, config.modems); 76 const modem = modems.getModemConfig(handlerName, config.modems);
77 if (!modem) { 77 if (!modem) {
78 logger.warn('Not knowing modem to use. Ignoring message', { destination_number: destinationNumber, msg: msg, handler_name: handlerName }); 78 logger.warn('Not knowing modem to use. Ignoring message', { destination_number: destinationNumber, msg: msg, handler_name: handlerName });
79 return; 79 return;
80 } 80 }
81 81
82 if (!modem.url || !modem.apikey) { 82 if (!modem.url || !modem.apikey) {
83 logger.warn('Invalid modem configuration', { config: modem, handler_name: handlerName }); 83 logger.warn('Invalid modem configuration', { config: modem, handler_name: handlerName });
84 return; 84 return;
85 } 85 }
86 86
87 const reqId = uuidv4(); 87 const reqId = uuidv4();
88 88
89 history.push({ 89 history.push({
90 ts: moment().format('YYYY-MM-DD HH:mm:ss'), 90 ts: moment().format('YYYY-MM-DD HH:mm:ss'),
91 modem: { 91 modem: {
92 name: handlerName, 92 name: handlerName,
93 }, 93 },
94 direction: 'OUTGOING', 94 direction: 'OUTGOING',
95 partner: destinationNumber, 95 partner: destinationNumber,
96 message: msg, 96 message: msg,
97 }); 97 });
98 98
99 99
100 const requestOptions = { 100 const requestOptions = {
101 url: modem.url, 101 url: modem.url,
102 qs: { 102 qs: {
103 msg: msg, 103 msg: msg,
104 number: destinationNumber, 104 number: destinationNumber,
105 reqid: reqId, 105 reqid: reqId,
106 apikey: modem.apikey 106 apikey: modem.apikey
107 } 107 }
108 } 108 }
109 109
110 logger.info('Sending message to modem handler', { req_id: reqId, destination_number: destinationNumber, msg: msg, msg_length: msg.length, handler_name: handlerName }); 110 logger.info('Sending message to modem handler', { req_id: reqId, destination_number: destinationNumber, msg: msg, msg_length: msg.length, handler_name: handlerName });
111 request(requestOptions, function(err, res, body) { 111 request(requestOptions, function(err, res, body) {
112 if (err) { 112 if (err) {
113 logger.warn('Error requesting to modem handler. ' + err.toString(), { req_id: reqId, handler_name: handlerName }); 113 logger.warn('Error requesting to modem handler. ' + err.toString(), { req_id: reqId, handler_name: handlerName });
114 114
115 } 115 }
116 else if (res.statusCode != 200) { 116 else if (res.statusCode != 200) {
117 logger.warn('Modem handler not responding with HTTP status code 200.', { http_status_code: res.statusCode, req_id: reqId, handler_name: handlerName }); 117 logger.warn('Modem handler not responding with HTTP status code 200.', { http_status_code: res.statusCode, req_id: reqId, handler_name: handlerName });
118 } 118 }
119 else { 119 else {
120 logger.verbose('Message sent to handler', { req_id: reqId, handler_name: handlerName, response_body: body }); 120 logger.verbose('Message sent to handler', { req_id: reqId, handler_name: handlerName, response_body: body });
121 } 121 }
122 }) 122 })
123 123
124 } 124 }
125 125
126 async function send(partner, msg, origin) { 126 async function send(partner, msg, origin) {
127 if (!partner) return; 127 if (!partner) return;
128 128
129 if (typeof msg !== 'string') { 129 if (typeof msg !== 'string') {
130 logger.warn('Message to send is not a string, ignoring message'); 130 logger.warn('Message to send is not a string, ignoring message');
131 return; 131 return;
132 } 132 }
133 133
134 msg = msg.trim(); 134 msg = msg.trim();
135 if (!msg) return; 135 if (!msg) return;
136 136
137 const destinationNumber = modems.removeSuffixFromNumber(partner, config); 137 const destinationNumber = modems.removeSuffixFromNumber(partner, config);
138 138
139 logger.verbose('Choosing handler name', { partner: partner, msg: msg, origin: origin }); 139 logger.verbose('Choosing handler name', { partner, destinationNumber, msg, origin });
140 let handlerName = ( await _getApproriateHandler(destinationNumber) ); 140 let handlerName = ( await _getApproriateHandler(destinationNumber) );
141 141
142 _send(destinationNumber, msg, handlerName); 142 _send(destinationNumber, msg, handlerName);
143 } 143 }
144 144
145 exports.send = send; 145 exports.send = send;