push-task-prepaid.js 3.1 KB
const MODULE_NAME = 'KOMODO-SDK-PUSH-TRX.CLIENT.PUSH-TASK-PREPAID';

const MAX_RETRY = 3;
const RETRY_DELAY_MS = 2 * 1000;

const uniqid = require('uniqid');
const config = require('komodo-sdk/config');
const { report } = require('komodo-sdk/gateway/pull');
const logger = require('tektrans-logger');
const wsList = require('./ws-list');

/**
 * @param  {string} xid
 * @param  {object} task
 * @param  {string} gwName
 * @param  {number} [retry]
 */
const pusher = (xid, task, gwName, retry) => {
    /**
     * @type WebSocket
     */
    const ws = wsList[gwName];

    if (!ws) {
        logger.verbose(`${MODULE_NAME} 7EB181CF: Invalid websocket`, {
            xid,
            gwName,
            hasWs: !!ws,
        });

        if ((retry || 0) < MAX_RETRY) {
            logger.verbose(`${MODULE_NAME} B7B937A2: Will retry`, {
                xid,
                retried: retry || 0,
                delayMs: RETRY_DELAY_MS,
            });

            report({
                trx_id: task.trx_id,
                rc: '68',
                message: {
                    xid,
                    'KOMODO-SDK-PUSH-TRX': {
                        msg: 'B7B937A2 Invalid websocket on pushing to related gateway, will retry',
                        gwOrigin: config.partner.handler_name,
                        gwTarget: gwName,
                        retried: retry || 0,
                    },
                },
            }, xid);

            setTimeout(() => {
                logger.verbose(`${MODULE_NAME} EA985FC2: Retrying`, {
                    xid,
                    retried: (retry || 0) + 1,
                });

                pusher(xid, task, gwName, (retry || 0) + 1);
            }, RETRY_DELAY_MS);
        } else {
            logger.warn(`${MODULE_NAME} 7151F200: Retry exceeded`, {
                xid,
                retried: (retry || 0) + 1,
            });

            report({
                trx_id: task.trx_id,
                rc: '91',
                message: {
                    xid,
                    'KOMODO-SDK-PUSH-TRX': {
                        msg: '7151F200 Invalid websocket on pushing to related gateway, retry exceeded',
                        gwOrigin: config.partner.handler_name,
                        gwTarget: gwName,
                        retried: retry || 0,
                    },
                },
            }, xid);
        }

        return;
    }

    const pushReportMsg = `${MODULE_NAME} 1E8EB9B9: Pushing task to related gateway`;
    logger.verbose(pushReportMsg, {
        xid, gwName, task,
    });

    report({
        trx_id: task.trx_id,
        rc: '68',
        message: {
            xid,
            'KOMODO-SDK-PUSH-TRX': {
                msg: pushReportMsg,
                gwOrigin: config.partner.handler_name,
                gwTarget: gwName,
            },
        },
    });

    ws.send(JSON.stringify({
        type: 'TASK',
        ts: new Date(),
        rid: xid || uniqid(),
        senderName: config.handler_name,
        payload: task,
    }));

    logger.verbose(`${MODULE_NAME} 7D3CECCA: Task pushed`, { xid, gwName });
};

module.exports = pusher;