Commit fa547d3050014cbb974dd65e8993d664c98d0242

Authored by Adhidarma Hadiwinoto
1 parent 537d5f6e87
Exists in master

Add custom-ping

Showing 5 changed files with 190 additions and 17 deletions Side-by-side Diff

... ... @@ -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 }
... ... @@ -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 +}
... ... @@ -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  
... ... @@ -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",
... ... @@ -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 }