Commit 077f3b0aa21c030039f0ef39eac0749f88c8bc0d
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
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 | 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(); |