index.js
3.36 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
const MODULE_NAME = 'POSTPAID-SDK';
const config = require('komodo-sdk/config');
const DEFAULT_CORE_REQUEST_TIMEOUT = 15 * 1000;
const DEFAULT_SLEEP_AFTER_CORE_ERROR_MS = 3000;
const PULL_INTERVAL_MS = config.postpaid_pull_interval_ms || config.pull_interval_ms || 1000;
const DEFAULT_CORE_AXIOS_CONFIG = {
headers: { 'Content-Type': 'application/json' },
timeout: config.core_request_timeout || config.request_timeout || DEFAULT_CORE_REQUEST_TIMEOUT,
};
const GET_TASK_AXIOS_CONFIG = DEFAULT_CORE_AXIOS_CONFIG;
const axios = require('axios').default;
const uniqid = require('uniqid');
const coreUrl = require('komodo-sdk/core-url');
const logger = require('tektrans-logger');
const report = require('./lib/report');
const sleep = require('./lib/sleep');
const composeGatewayLocations = require('./lib/compose-gateway-locations');
let partner;
let first = true;
let coreIsHealthy = null;
const CORE_ENDPOINT = `${coreUrl}/postpaid2/task`;
function detectCoreStatusChange(isHealthy, url, err) {
if (coreIsHealthy !== isHealthy) {
coreIsHealthy = isHealthy;
if (isHealthy) {
logger.info(`${MODULE_NAME} D7F6DBE4: CORE is healthy now`, {
url, err: err && err.message,
});
} else {
logger.warn(`${MODULE_NAME} 460EC596: CORE is unhealthy now`, {
url, err: err && err.message,
});
}
}
}
async function getTask() {
if (!partner) return null;
const xid = uniqid();
if (first) {
first = false;
logger.verbose(`${MODULE_NAME} 20A30442: First getTask pull request to CORE`, { xid });
}
const payload = {
handler: config.handler || config.handler_name,
products: config.products || [],
locations: composeGatewayLocations(config),
};
let task;
try {
const result = await axios.post(
CORE_ENDPOINT,
payload,
GET_TASK_AXIOS_CONFIG,
);
if (!result || !result.data) {
throw new Error(`${MODULE_NAME} 26F332C6: Empty CORE response on pulling task`);
}
if (result && result.data && result.data.task && !result.data.task.postpaid) {
throw new Error(`${MODULE_NAME} B338CEF8: CORE returning non postpaid task on pulling task`);
}
detectCoreStatusChange(true, CORE_ENDPOINT);
task = result.data.task;
} catch (e) {
// skipNext = 3;
detectCoreStatusChange(false, CORE_ENDPOINT, e);
await sleep(DEFAULT_SLEEP_AFTER_CORE_ERROR_MS);
}
if (!task) return null;
task.remote_product = ((config.remote_products || {})[task.product]) || task.product;
task.trx_id = Number(task.trx_id) + (config.sdk_trx_id_adder || 0);
logger.verbose(`${MODULE_NAME} 441E8C96: Got task from CORE on pulling task`, { xid, task });
if (task.inquiry_only) {
if (typeof partner.inquiry === 'function') partner.inquiry(task, xid);
return task;
}
if (typeof partner.pay === 'function') {
partner.pay(task, xid);
return task;
}
return null;
}
const getTaskLooper = async () => {
await getTask();
setTimeout(() => {
getTaskLooper();
}, PULL_INTERVAL_MS);
};
exports.setPartner = (val) => {
partner = val;
// setInterval(getTaskLooper, config.pull_interval_ms || 1000);
getTaskLooper();
};
exports.report = report;