Blame view

lib/transport.js 4.17 KB
c0741a574   Adhidarma Hadiwinoto   Completed
1
  "use strict";
3f614b14a   Adhidarma Hadiwinoto   MAX_SMS_LENGTH
2
  const MAX_SMS_LENGTH = 160;
f43dbc16a   Adhidarma Hadiwinoto   New modem selector
3
  const url = require('url');
c0741a574   Adhidarma Hadiwinoto   Completed
4
5
  const request = require('request');
  const uuidv4 = require('uuid/v4');
4fbfae95f   Adhidarma Hadiwinoto   Messages history
6
  const moment = require('moment');
c0741a574   Adhidarma Hadiwinoto   Completed
7
8
9
  
  const config = require('komodo-sdk/config');
  const logger = require('komodo-sdk/logger');
ef1c8149d   Adhidarma Hadiwinoto   Histori pengirima...
10
  const messagingService = require('komodo-center-messaging-client-lib');
f43dbc16a   Adhidarma Hadiwinoto   New modem selector
11
12
  const modemSelect = require('./modemSelect');
  const modems = require('./modems2');
f53fe083f   Adhidarma Hadiwinoto   Sender chooser algo
13
  const partnerLastSeen = require('./partner-last-seen');
4fbfae95f   Adhidarma Hadiwinoto   Messages history
14
  const history = require('./history');
6cd19a9c9   Adhidarma Hadiwinoto   Typo
15
  const prefixes = require('./prefixes');
c0741a574   Adhidarma Hadiwinoto   Completed
16

03f73469d   Adhidarma Hadiwinoto   Partner last seen...
17
  function _send(destinationNumber, msg, handlerIMSI) {
f53fe083f   Adhidarma Hadiwinoto   Sender chooser algo
18

077f3b0aa   Adhidarma Hadiwinoto   Support long sms ...
19
      if (msg.length > 160) {
03f73469d   Adhidarma Hadiwinoto   Partner last seen...
20
          logger.info('Splitting message');
3f614b14a   Adhidarma Hadiwinoto   MAX_SMS_LENGTH
21
22
          const newMsg = msg.slice(0, MAX_SMS_LENGTH);
          const remainingMsg = msg.slice(MAX_SMS_LENGTH);
f53fe083f   Adhidarma Hadiwinoto   Sender chooser algo
23

03f73469d   Adhidarma Hadiwinoto   Partner last seen...
24
          _send(destinationNumber, newMsg, handlerIMSI);
077f3b0aa   Adhidarma Hadiwinoto   Support long sms ...
25
          setTimeout(() => {
03f73469d   Adhidarma Hadiwinoto   Partner last seen...
26
27
              _send(destinationNumber, remainingMsg, handlerIMSI);
          }, 1000);
077f3b0aa   Adhidarma Hadiwinoto   Support long sms ...
28
29
30
  
          return;
      }
c0741a574   Adhidarma Hadiwinoto   Completed
31

03f73469d   Adhidarma Hadiwinoto   Partner last seen...
32
      const modem = modems.get('imsi', handlerIMSI);
c0741a574   Adhidarma Hadiwinoto   Completed
33
      if (!modem) {
03f73469d   Adhidarma Hadiwinoto   Partner last seen...
34
          logger.warn('Not knowing modem to use. Ignoring message', { destination_number: destinationNumber, msg: msg, modem_imsi: handlerIMSI });
c0741a574   Adhidarma Hadiwinoto   Completed
35
36
          return;
      }
f43dbc16a   Adhidarma Hadiwinoto   New modem selector
37
38
      if (!modem.reportIp || !modem.reportPort || !modem.reportApikey) {
          logger.warn('Invalid modem configuration', { modem });
c0741a574   Adhidarma Hadiwinoto   Completed
39
40
          return;
      }
077f3b0aa   Adhidarma Hadiwinoto   Support long sms ...
41
      const reqId = uuidv4();
4fbfae95f   Adhidarma Hadiwinoto   Messages history
42
43
44
      history.push({
          ts: moment().format('YYYY-MM-DD HH:mm:ss'), 
          modem: {
03f73469d   Adhidarma Hadiwinoto   Partner last seen...
45
46
47
              name: modem.name,
              imsi: modem.imsi,
              msisdn: modem.msisdn,
4fbfae95f   Adhidarma Hadiwinoto   Messages history
48
49
50
51
52
          },
          direction: 'OUTGOING',
          partner: destinationNumber,
          message: msg,
      });
8fb5c9291   Adhidarma Hadiwinoto   DEBUG
53
      logger.verbose('TRANSPORT: saving outgoing message');
ef1c8149d   Adhidarma Hadiwinoto   Histori pengirima...
54
55
56
57
58
59
60
61
62
63
64
      messagingService.onIncomingMessage({
          me: modem.name,
          partner: destinationNumber,
          partner_raw: `+${destinationNumber}`.replace(/^\++/, '+'),
          msg: msg,
          origin_label: `IMSI_${modem.imsi || 'UNKNOWN'}`,
          origin_transport: 'SMS',
          origin_partner: destinationNumber,
          do_not_forward_to_core: true,
          is_outgoing: true,
      });
c0741a574   Adhidarma Hadiwinoto   Completed
65
      const requestOptions = {
f43dbc16a   Adhidarma Hadiwinoto   New modem selector
66
67
68
69
          url: url.format({
              protocol: 'http',
              hostname: modem.reportIp,
              port: modem.reportPort,
70431f3a4   Adhidarma Hadiwinoto   Default modem.rep...
70
              pathname: modem.reportPathSms || '/sms',
f43dbc16a   Adhidarma Hadiwinoto   New modem selector
71
          }),
c0741a574   Adhidarma Hadiwinoto   Completed
72
73
74
75
          qs: {
              msg: msg,
              number: destinationNumber,
              reqid: reqId,
b6d23624a   Adhidarma Hadiwinoto   ModemData.reportP...
76
              apikey: modem.reportApikey,
c0741a574   Adhidarma Hadiwinoto   Completed
77
78
          }
      }
03f73469d   Adhidarma Hadiwinoto   Partner last seen...
79
      logger.info('Sending message to modem handler', { req_id: reqId, destination_number: destinationNumber, msg: msg, msg_length: msg.length, modem_name: modem.name, modem_imsi: modem.imsi });
c0741a574   Adhidarma Hadiwinoto   Completed
80
81
      request(requestOptions, function(err, res, body) {
          if (err) {
03f73469d   Adhidarma Hadiwinoto   Partner last seen...
82
              logger.warn('Error requesting to modem handler. ' + err.toString(), { req_id: reqId, modem_name: modem.name, modem_imsi: modem.imsi });
c0741a574   Adhidarma Hadiwinoto   Completed
83
84
85
              
          }
          else if (res.statusCode != 200) {
03f73469d   Adhidarma Hadiwinoto   Partner last seen...
86
              logger.warn('Modem handler not responding with HTTP status code 200.', { http_status_code: res.statusCode, req_id: reqId, modem_name: modem.name, modem_imsi: modem.imsi });
c0741a574   Adhidarma Hadiwinoto   Completed
87
88
          }
          else {
03f73469d   Adhidarma Hadiwinoto   Partner last seen...
89
              logger.verbose('Message sent to handler', { req_id: reqId, modem_name: modem.name, modem_imsi: modem.imsi, response_body: body });
c0741a574   Adhidarma Hadiwinoto   Completed
90
91
          }
      })
077f3b0aa   Adhidarma Hadiwinoto   Support long sms ...
92
93
  
  }
62e23ff59   Adhidarma Hadiwinoto   Hapus parameter t...
94
  async function send(partner, msg) {
077f3b0aa   Adhidarma Hadiwinoto   Support long sms ...
95
96
97
98
99
100
101
102
103
      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;
f43dbc16a   Adhidarma Hadiwinoto   New modem selector
104
      const destinationNumber = modemSelect.removeSuffixFromNumber(partner, config);
4acd86be1   Adhidarma Hadiwinoto   Typo
105
      const prefixName = await prefixes.lookup(destinationNumber);
6cd19a9c9   Adhidarma Hadiwinoto   Typo
106
      logger.verbose('Destination number prefix lookup', {partner: destinationNumber, prefix: prefixName});
f43dbc16a   Adhidarma Hadiwinoto   New modem selector
107
108
  
      // logger.verbose('Choosing handler name', { partner, destinationNumber, msg, origin });
03f73469d   Adhidarma Hadiwinoto   Partner last seen...
109
      const handlerIMSI = await partnerLastSeen.get(destinationNumber) ;
077f3b0aa   Adhidarma Hadiwinoto   Support long sms ...
110

03f73469d   Adhidarma Hadiwinoto   Partner last seen...
111
      if (!handlerIMSI) {
f43dbc16a   Adhidarma Hadiwinoto   New modem selector
112
113
114
          logger.warn(`Unknown handler for sending message to partner`, { partner, destinationNumber });
          return;
      }
077f3b0aa   Adhidarma Hadiwinoto   Support long sms ...
115

03f73469d   Adhidarma Hadiwinoto   Partner last seen...
116
      _send(destinationNumber, msg, handlerIMSI);
c0741a574   Adhidarma Hadiwinoto   Completed
117
118
119
  }
  
  exports.send = send;