Commit 077f3b0aa21c030039f0ef39eac0749f88c8bc0d

Authored by Adhidarma Hadiwinoto
1 parent f53fe083fc
Exists in master

Support long sms (waiting for lock support on modem)

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