Commit b01439988ee4ec046999b313dfb09fb7fbd73e1c
1 parent
5a9e424b02
Exists in
master
Debug
Showing 1 changed file with 1 additions and 1 deletions Inline Diff
lib/transport.js
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; |