Commit 9b38a77f17ba6bae85858487ae4473dbf59f8e33
1 parent
5157ab43c3
Exists in
master
MODEM-CHOOSER new orders.
- by prefix - unknown prefix - last seen - default
Showing 2 changed files with 11 additions and 6 deletions Inline Diff
config.sample.json
1 | { | 1 | { |
2 | "name": "SMS", | 2 | "name": "SMS", |
3 | 3 | ||
4 | "# messaging_url": "messaging service url", | 4 | "# messaging_url": "messaging service url", |
5 | "messaging_url": "http://localhost:32979/", | 5 | "messaging_url": "http://localhost:32979/", |
6 | 6 | ||
7 | "# listen_port": "HTTP port untuk mendapat perintah dari CORE", | 7 | "# listen_port": "HTTP port untuk mendapat perintah dari CORE", |
8 | "listen_port": 16480, | 8 | "listen_port": 16480, |
9 | 9 | ||
10 | "apiserver": { | 10 | "apiserver": { |
11 | "# listen_port": "HTTP port untuk mendapat pesan masuk dari modem handler", | 11 | "# listen_port": "HTTP port untuk mendapat pesan masuk dari modem handler", |
12 | "listen_port": 16481, | 12 | "listen_port": 16481, |
13 | "apikey": "PLEASE_CHANGE_ME" | 13 | "apikey": "PLEASE_CHANGE_ME" |
14 | }, | 14 | }, |
15 | 15 | ||
16 | "number_suffix": "@phonenumber", | 16 | "number_suffix": "@phonenumber", |
17 | 17 | ||
18 | "modems": { | 18 | "modems": { |
19 | "SMS0": { | 19 | "SMS0": { |
20 | "url": "http://localhost:2110/sms", | 20 | "url": "http://localhost:2110/sms", |
21 | "apikey": "PLEASE_CHANGE_ME" | 21 | "apikey": "PLEASE_CHANGE_ME" |
22 | } | 22 | } |
23 | }, | 23 | }, |
24 | 24 | ||
25 | "do_not_trim_long_sms": false, | 25 | "do_not_trim_long_sms": false, |
26 | 26 | ||
27 | "default_modem": "SMS0", | 27 | "default_modem": "SMS0", |
28 | 28 | ||
29 | "# handler_chooser_algorithm": "algoritma untuk memilih modem dalam mengirim SMS. Pilihan: LAST-SEEN, FORCED. Default: LAST-SEEN", | 29 | "# handler_chooser_algorithm": "algoritma untuk memilih modem dalam mengirim SMS. Pilihan: LAST-SEEN, FORCED. Default: LAST-SEEN", |
30 | "handler_chooser_algorithm": "LAST-SEEN", | 30 | "handler_chooser_algorithm": "LAST-SEEN", |
31 | 31 | ||
32 | "# sending handler": "list modem yang dipakai untuk mengirim jika handler_chooser_algorithm === 'FORCED'", | 32 | "# sending handler": "list modem yang dipakai untuk mengirim jika handler_chooser_algorithm === 'FORCED'", |
33 | "sending_handler": [ | 33 | "sending_handler": [ |
34 | "SMS0", | 34 | "SMS0", |
35 | "SMS1" | 35 | "SMS1" |
36 | ], | 36 | ], |
37 | 37 | ||
38 | "imsi_senders": { | 38 | "imsi_senders": { |
39 | "prefix_names": { | 39 | "prefix_names": { |
40 | "TELKOMSEL": [ | 40 | "TELKOMSEL": [ |
41 | "510890944235402" | ||
42 | ], | 41 | ], |
43 | "XL": [ | 42 | "XL": [ |
44 | "510890944262917" | ||
45 | ] | 43 | ] |
46 | }, | 44 | }, |
45 | "unknown_prefix": [ | ||
46 | ], | ||
47 | "default": [ | 47 | "default": [ |
48 | "510890944235513" | ||
49 | ] | 48 | ] |
50 | }, | 49 | }, |
51 | 50 | ||
52 | "redis": { | 51 | "redis": { |
53 | "host": "127.0.0.1" | 52 | "host": "127.0.0.1" |
lib/modem-chooser.js
1 | 'use strict'; | 1 | 'use strict'; |
2 | 2 | ||
3 | const prefixes = require('./prefixes'); | 3 | const prefixes = require('./prefixes'); |
4 | const modems = require('./modems2'); | 4 | const modems = require('./modems2'); |
5 | const partnerLastSeen = require('./partner-last-seen'); | 5 | const partnerLastSeen = require('./partner-last-seen'); |
6 | 6 | ||
7 | function filterOutCandidates(candidates) { | 7 | function filterOutCandidates(candidates) { |
8 | if (!Array.isArray(candidates)) { | 8 | if (!Array.isArray(candidates)) { |
9 | return []; | 9 | return []; |
10 | } | 10 | } |
11 | 11 | ||
12 | return candidates.filter((item) => { | 12 | return candidates.filter((item) => { |
13 | if (item.indexOf('#') >= 0) return false; | 13 | if (item.indexOf('#') >= 0) return false; |
14 | 14 | ||
15 | const modem = modems.get('by_imsi', item); | 15 | const modem = modems.get('by_imsi', item); |
16 | if (!modem) return false; | 16 | if (!modem) return false; |
17 | 17 | ||
18 | return true; | 18 | return true; |
19 | }); | 19 | }); |
20 | } | 20 | } |
21 | 21 | ||
22 | exports.chooser = async function chooser(destination, config) { | 22 | exports.chooser = async function chooser(destination, config) { |
23 | const logger = global.KOMODO_LOGGER; | 23 | const logger = global.KOMODO_LOGGER; |
24 | 24 | ||
25 | let prefixName = await prefixes.lookup(destination); | 25 | let prefixName = await prefixes.lookup(destination); |
26 | if (typeof prefixName === 'string') { | 26 | if (typeof prefixName === 'string') { |
27 | prefixName = prefixName.toUpperCase(); | 27 | prefixName = prefixName.toUpperCase(); |
28 | } | 28 | } |
29 | 29 | ||
30 | if (logger) logger.verbose('MODEM-CHOOSER: Choosing suitable senders', { destination, prefixName }); | 30 | if (logger) logger.verbose('MODEM-CHOOSER: Choosing suitable senders', { destination, prefixName }); |
31 | 31 | ||
32 | let imsiSenders = []; | 32 | let imsiSenders = []; |
33 | if (config.imsi_senders && prefixName && config.imsi_senders.prefix_names && config.imsi_senders.prefix_names[prefixName]) { | 33 | if (config.imsi_senders && prefixName && config.imsi_senders.prefix_names && config.imsi_senders.prefix_names[prefixName]) { |
34 | imsiSenders = filterOutCandidates(config.imsi_senders.prefix_names[prefixName]); | 34 | imsiSenders = filterOutCandidates(config.imsi_senders.prefix_names[prefixName]); |
35 | if (logger) logger.verbose('MODEM-CHOOSER: Try to use imsi senders by prefix name', { destination, prefixName, imsiSenders }); | 35 | if (logger) logger.verbose('MODEM-CHOOSER: Try to use imsi senders by prefix name', { destination, prefixName, imsiSenders }); |
36 | } | 36 | } |
37 | 37 | ||
38 | if (!imsiSenders.length && config.imsi_senders && config.imsi_senders.default && Array.isArray(config.imsi_senders.default) && config.imsi_senders.default.length) { | 38 | if (!imsiSenders.length && config.imsi_senders && config.imsi_senders.unknown_prefix) { |
39 | imsiSenders = filterOutCandidates(config.imsi_senders.default); | 39 | imsiSenders = filterOutCandidates(config.imsi_senders.unknown_prefix); |
40 | if (logger) logger.verbose('MODEM-CHOOSER: Try to use default senders', { destination, prefixName, imsiSenders }); | 40 | if (logger) logger.verbose('MODEM-CHOOSER: Try to use senders for unknown prfix', { destination, prefixName, imsiSenders }); |
41 | } | 41 | } |
42 | 42 | ||
43 | if (!imsiSenders.length) { | 43 | if (!imsiSenders.length) { |
44 | imsiSenders = filterOutCandidates([ await partnerLastSeen.get(destination) ]); | 44 | imsiSenders = filterOutCandidates([ await partnerLastSeen.get(destination) ]); |
45 | if (logger) logger.verbose('MODEM-CHOOSER: Try to use sender by last seen', { destination, prefixName, imsiSenders }); | 45 | if (logger) logger.verbose('MODEM-CHOOSER: Try to use sender by last seen', { destination, prefixName, imsiSenders }); |
46 | } | 46 | } |
47 | 47 | ||
48 | if (!imsiSenders.length && config.imsi_senders && config.imsi_senders.default) { | ||
49 | imsiSenders = filterOutCandidates(config.imsi_senders.default); | ||
50 | if (logger) logger.verbose('MODEM-CHOOSER: Try to use default senders', { destination, prefixName, imsiSenders }); | ||
51 | } | ||
52 | |||
53 | |||
48 | if (!imsiSenders.length) { | 54 | if (!imsiSenders.length) { |
49 | if (logger) logger.warn('MODEM-CHOOSER: No suitable sender found', { destination, prefixName }); | 55 | if (logger) logger.warn('MODEM-CHOOSER: No suitable sender found', { destination, prefixName }); |
50 | return; | 56 | return; |
51 | } | 57 | } |
52 | 58 | ||
53 | const count = imsiSenders.length; | 59 | const count = imsiSenders.length; |
54 | const idx = Math.round(Math.random() * (count - 1)); | 60 | const idx = Math.round(Math.random() * (count - 1)); |
55 | const imsiChoosed = imsiSenders[idx]; | 61 | const imsiChoosed = imsiSenders[idx]; |
56 | 62 | ||
57 | if (logger) logger.verbose(`MODEM-CHOOSER: gonna use modem with IMSI ${imsiChoosed}`, { destination, prefixName, imsiSenders }); | 63 | if (logger) logger.verbose(`MODEM-CHOOSER: gonna use modem with IMSI ${imsiChoosed}`, { destination, prefixName, imsiSenders }); |
58 | 64 | ||
59 | return imsiChoosed; | 65 | return imsiChoosed; |
60 | } | 66 | } |