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