Commit fa547d3050014cbb974dd65e8993d664c98d0242
1 parent
537d5f6e87
Exists in
master
Add custom-ping
Showing 5 changed files with 190 additions and 17 deletions Side-by-side Diff
config.sample.json
... | ... | @@ -6,5 +6,13 @@ |
6 | 6 | "messaging_url": "http://localhost:32979/", |
7 | 7 | "listen_port": 32989, |
8 | 8 | "ping_interval_ms": 60000, |
9 | - "do_not_terminate_on_error": false | |
9 | + "do_not_terminate_on_error": false, | |
10 | + "custom_ping": { | |
11 | + "verbose": false, | |
12 | + "disable_pong": false, | |
13 | + "allowed_from_all": false, | |
14 | + "allowed_from_partners": [], | |
15 | + "interval_ms": 25000, | |
16 | + "send_to": [] | |
17 | + } | |
10 | 18 | } |
lib/custom-ping.js
... | ... | @@ -0,0 +1,98 @@ |
1 | +const MODULE_NAME = 'CUSTOM-PING'; | |
2 | + | |
3 | +const uniqid = require('uniqid'); | |
4 | +const config = require('komodo-sdk/config'); | |
5 | +const logger = require('komodo-sdk/logger'); | |
6 | + | |
7 | +let bot; | |
8 | + | |
9 | +const allowedFromPartnerList = (config.custom_ping.allowed_from_partners || []) | |
10 | + .filter((item) => typeof item === 'string') | |
11 | + .map((item) => (item || '').trim().toUpperCase()) | |
12 | + .filter((item) => item); | |
13 | + | |
14 | +const setBot = (botFromCaller) => { | |
15 | + bot = botFromCaller; | |
16 | +}; | |
17 | +exports.setBot = setBot; | |
18 | + | |
19 | +const isPingMessage = (msg) => { | |
20 | + if (!msg) return false; | |
21 | + if (typeof msg !== 'string') return false; | |
22 | + | |
23 | + return ((msg || '').trim().toUpperCase().search(/^PING($| )/) === 0); | |
24 | +}; | |
25 | +exports.isPingMessage = isPingMessage; | |
26 | + | |
27 | +const isPongMessage = (msg) => { | |
28 | + if (!msg) return false; | |
29 | + if (typeof msg !== 'string') return false; | |
30 | + | |
31 | + return ((msg || '').trim().toUpperCase().search(/^PONG($| )/) === 0); | |
32 | +}; | |
33 | +exports.isPongMessage = isPongMessage; | |
34 | + | |
35 | +const isAllowedPartner = (partner) => { | |
36 | + if (!config.custom_ping) return false; | |
37 | + if (config.custom_ping.disable_pong) return false; | |
38 | + | |
39 | + if (config.custom_ping.allowed_from_all) return true; | |
40 | + return allowedFromPartnerList.indexOf((partner || '').trim().toUpperCase()) >= 0; | |
41 | +}; | |
42 | +exports.isAllowedPartner = isAllowedPartner; | |
43 | + | |
44 | +const sendPong = (xid, partner, pingMessage) => { | |
45 | + if (!bot) return; | |
46 | + if (!partner || typeof partner !== 'string' || !partner.trim()) return; | |
47 | + | |
48 | + const tokens = pingMessage.trim().split(/ +/); | |
49 | + | |
50 | + const pongMessage = [ | |
51 | + 'PONG', | |
52 | + (tokens && tokens[1]) || null, | |
53 | + ].filter((item) => item) | |
54 | + .join(' '); | |
55 | + | |
56 | + if (config.custom_ping && config.custom_ping.verbose) { | |
57 | + logger.verbose(`${MODULE_NAME} F0D18EF4: Responding PING message`, { | |
58 | + xid, partner, pongMessage, | |
59 | + }); | |
60 | + } | |
61 | + | |
62 | + bot.send(partner.trim(), pongMessage); | |
63 | +}; | |
64 | +exports.sendPong = sendPong; | |
65 | + | |
66 | +const pingSender = () => { | |
67 | + const xid = uniqid(); | |
68 | + if ( | |
69 | + !bot | |
70 | + || !config.custom_ping | |
71 | + || !config.custom_ping.send_to | |
72 | + || !Array.isArray(config.custom_ping.send_to) | |
73 | + || !config.custom_ping.send_to.length | |
74 | + ) return; | |
75 | + | |
76 | + config.custom_ping.send_to.forEach((partner) => { | |
77 | + if (config.custom_ping.verbose) { | |
78 | + logger.verbose(`${MODULE_NAME} 21358F45: Sending custom ping`, { | |
79 | + xid, | |
80 | + partner, | |
81 | + }); | |
82 | + } | |
83 | + | |
84 | + bot.send(partner, `PING ${xid}`); | |
85 | + }); | |
86 | +}; | |
87 | + | |
88 | +if (config.custom_ping.send_to) { | |
89 | + const intervalMs = (config.custom_ping && config.custom_ping.interval_ms) || 25 * 1000; | |
90 | + logger.verbose(`${MODULE_NAME} 324034EE: Registering ping sender`, { | |
91 | + intervalMs, | |
92 | + partners: config.custom_ping.send_to, | |
93 | + }); | |
94 | + | |
95 | + setInterval(() => { | |
96 | + pingSender(); | |
97 | + }, intervalMs); | |
98 | +} |
lib/transport.js
... | ... | @@ -5,6 +5,9 @@ const bot = require('simple-xmpp'); |
5 | 5 | const config = require('komodo-sdk/config'); |
6 | 6 | const logger = require('komodo-sdk/logger'); |
7 | 7 | const messagingService = require('komodo-center-messaging-client-lib'); |
8 | +const uniqid = require('uniqid'); | |
9 | + | |
10 | +const customPing = require('./custom-ping'); | |
8 | 11 | |
9 | 12 | let isReady; |
10 | 13 | |
... | ... | @@ -38,12 +41,43 @@ bot.on('chat', (partner, msg) => { |
38 | 41 | return; |
39 | 42 | } |
40 | 43 | |
44 | + const xid = uniqid(); | |
45 | + | |
46 | + if (customPing.isPongMessage(msg)) { | |
47 | + if (config.custom_ping && config.custom_ping.verbose) { | |
48 | + logger.verbose(`${MODULE_NAME} 70CDD087: Got PONG message`, { | |
49 | + xid, | |
50 | + partner, | |
51 | + msg, | |
52 | + }); | |
53 | + } | |
54 | + return; | |
55 | + } | |
56 | + | |
57 | + if (customPing.isPingMessage(msg) && customPing.isAllowedPartner(partner)) { | |
58 | + if (config.custom_ping && config.custom_ping.verbose) { | |
59 | + logger.verbose(`${MODULE_NAME} ED8C8786: Processing PING message`, { | |
60 | + xid, | |
61 | + partner, | |
62 | + msg, | |
63 | + }); | |
64 | + } | |
65 | + | |
66 | + customPing.sendPong(xid, partner, msg); | |
67 | + return; | |
68 | + } | |
69 | + | |
41 | 70 | if (!isReady) { |
42 | - logger.warn('Warming up is not finished yet, ignoring message', { me: config.username, partner, msg }); | |
71 | + logger.warn('Warming up is not finished yet, ignoring message', { | |
72 | + xid, me: config.username, partner, msg, | |
73 | + }); | |
74 | + | |
43 | 75 | return; |
44 | 76 | } |
45 | 77 | |
46 | - logger.info('Incoming message via XMPP transport', { me: config.username, partner, msg }); | |
78 | + logger.info('Incoming message via XMPP transport', { | |
79 | + xid, me: config.username, partner, msg, | |
80 | + }); | |
47 | 81 | |
48 | 82 | if (messagingService && messagingService.onIncomingMessage) { |
49 | 83 | messagingService.onIncomingMessage( |
... | ... | @@ -51,19 +85,24 @@ bot.on('chat', (partner, msg) => { |
51 | 85 | me: config.username, |
52 | 86 | partner, |
53 | 87 | msg: msg.trim(), |
88 | + xid, | |
54 | 89 | }, |
55 | 90 | ); |
56 | 91 | } |
57 | 92 | }); |
58 | 93 | |
59 | 94 | bot.on('error', (err) => { |
95 | + const xid = uniqid(); | |
96 | + | |
60 | 97 | logger.warn(`${MODULE_NAME} F2E53C12: Error detected.`, { |
98 | + xid, | |
61 | 99 | eCode: err.code, |
62 | 100 | eMessage: err.message, |
63 | 101 | }); |
64 | 102 | |
65 | 103 | if (!config.do_not_terminate_on_error) { |
66 | 104 | logger.warn(`${MODULE_NAME} BA6C0C55: Terminating on error`, { |
105 | + xid, | |
67 | 106 | millisecondSleepBeforeTerminate: SLEEP_BEFORE_TERMINATE_ON_ERROR_MS, |
68 | 107 | }); |
69 | 108 |
package-lock.json
... | ... | @@ -12,7 +12,8 @@ |
12 | 12 | "komodo-center-messaging-client-lib": "git+https://gitlab.kodesumber.com/komodo/komodo-center-messaging-client-lib.git", |
13 | 13 | "komodo-sdk": "^1.43.8", |
14 | 14 | "simple-xmpp": "^1.3.1", |
15 | - "tektrans-logger": "^1.2.2" | |
15 | + "tektrans-logger": "^1.2.2", | |
16 | + "uniqid": "^5.4.0" | |
16 | 17 | }, |
17 | 18 | "devDependencies": { |
18 | 19 | "eslint": "^7.32.0", |
... | ... | @@ -2263,6 +2264,14 @@ |
2263 | 2264 | "winston-daily-rotate-file": "^3.10.0" |
2264 | 2265 | } |
2265 | 2266 | }, |
2267 | + "node_modules/komodo-center-messaging-client-lib/node_modules/uniqid": { | |
2268 | + "version": "4.1.1", | |
2269 | + "resolved": "https://registry.npmjs.org/uniqid/-/uniqid-4.1.1.tgz", | |
2270 | + "integrity": "sha1-iSIN32t1GuUrX3JISGNShZa7hME=", | |
2271 | + "dependencies": { | |
2272 | + "macaddress": "^0.2.8" | |
2273 | + } | |
2274 | + }, | |
2266 | 2275 | "node_modules/komodo-sdk": { |
2267 | 2276 | "version": "1.43.8", |
2268 | 2277 | "resolved": "https://registry.npmjs.org/komodo-sdk/-/komodo-sdk-1.43.8.tgz", |
... | ... | @@ -2326,6 +2335,14 @@ |
2326 | 2335 | "node": ">=4" |
2327 | 2336 | } |
2328 | 2337 | }, |
2338 | + "node_modules/komodo-sdk/node_modules/uniqid": { | |
2339 | + "version": "4.1.1", | |
2340 | + "resolved": "https://registry.npmjs.org/uniqid/-/uniqid-4.1.1.tgz", | |
2341 | + "integrity": "sha1-iSIN32t1GuUrX3JISGNShZa7hME=", | |
2342 | + "dependencies": { | |
2343 | + "macaddress": "^0.2.8" | |
2344 | + } | |
2345 | + }, | |
2329 | 2346 | "node_modules/kuler": { |
2330 | 2347 | "version": "2.0.0", |
2331 | 2348 | "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", |
... | ... | @@ -3808,12 +3825,9 @@ |
3808 | 3825 | } |
3809 | 3826 | }, |
3810 | 3827 | "node_modules/uniqid": { |
3811 | - "version": "4.1.1", | |
3812 | - "resolved": "https://registry.npmjs.org/uniqid/-/uniqid-4.1.1.tgz", | |
3813 | - "integrity": "sha1-iSIN32t1GuUrX3JISGNShZa7hME=", | |
3814 | - "dependencies": { | |
3815 | - "macaddress": "^0.2.8" | |
3816 | - } | |
3828 | + "version": "5.4.0", | |
3829 | + "resolved": "https://registry.npmjs.org/uniqid/-/uniqid-5.4.0.tgz", | |
3830 | + "integrity": "sha512-38JRbJ4Fj94VmnC7G/J/5n5SC7Ab46OM5iNtSstB/ko3l1b5g7ALt4qzHFgGciFkyiRNtDXtLNb+VsxtMSE77A==" | |
3817 | 3831 | }, |
3818 | 3832 | "node_modules/unpipe": { |
3819 | 3833 | "version": "1.0.0", |
... | ... | @@ -5888,6 +5902,14 @@ |
5888 | 5902 | "winston-circular-buffer": "^1.0.0", |
5889 | 5903 | "winston-daily-rotate-file": "^3.10.0" |
5890 | 5904 | } |
5905 | + }, | |
5906 | + "uniqid": { | |
5907 | + "version": "4.1.1", | |
5908 | + "resolved": "https://registry.npmjs.org/uniqid/-/uniqid-4.1.1.tgz", | |
5909 | + "integrity": "sha1-iSIN32t1GuUrX3JISGNShZa7hME=", | |
5910 | + "requires": { | |
5911 | + "macaddress": "^0.2.8" | |
5912 | + } | |
5891 | 5913 | } |
5892 | 5914 | } |
5893 | 5915 | }, |
... | ... | @@ -5943,6 +5965,14 @@ |
5943 | 5965 | "requires": { |
5944 | 5966 | "redis-errors": "^1.0.0" |
5945 | 5967 | } |
5968 | + }, | |
5969 | + "uniqid": { | |
5970 | + "version": "4.1.1", | |
5971 | + "resolved": "https://registry.npmjs.org/uniqid/-/uniqid-4.1.1.tgz", | |
5972 | + "integrity": "sha1-iSIN32t1GuUrX3JISGNShZa7hME=", | |
5973 | + "requires": { | |
5974 | + "macaddress": "^0.2.8" | |
5975 | + } | |
5946 | 5976 | } |
5947 | 5977 | } |
5948 | 5978 | }, |
... | ... | @@ -7097,12 +7127,9 @@ |
7097 | 7127 | } |
7098 | 7128 | }, |
7099 | 7129 | "uniqid": { |
7100 | - "version": "4.1.1", | |
7101 | - "resolved": "https://registry.npmjs.org/uniqid/-/uniqid-4.1.1.tgz", | |
7102 | - "integrity": "sha1-iSIN32t1GuUrX3JISGNShZa7hME=", | |
7103 | - "requires": { | |
7104 | - "macaddress": "^0.2.8" | |
7105 | - } | |
7130 | + "version": "5.4.0", | |
7131 | + "resolved": "https://registry.npmjs.org/uniqid/-/uniqid-5.4.0.tgz", | |
7132 | + "integrity": "sha512-38JRbJ4Fj94VmnC7G/J/5n5SC7Ab46OM5iNtSstB/ko3l1b5g7ALt4qzHFgGciFkyiRNtDXtLNb+VsxtMSE77A==" | |
7106 | 7133 | }, |
7107 | 7134 | "unpipe": { |
7108 | 7135 | "version": "1.0.0", |
package.json
... | ... | @@ -29,6 +29,7 @@ |
29 | 29 | "komodo-center-messaging-client-lib": "git+https://gitlab.kodesumber.com/komodo/komodo-center-messaging-client-lib.git", |
30 | 30 | "komodo-sdk": "^1.43.8", |
31 | 31 | "simple-xmpp": "^1.3.1", |
32 | - "tektrans-logger": "^1.2.2" | |
32 | + "tektrans-logger": "^1.2.2", | |
33 | + "uniqid": "^5.4.0" | |
33 | 34 | } |
34 | 35 | } |