Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Echo request initiated from SocketQueue every 5 minutes #50

Closed
cavebring opened this issue Dec 13, 2019 · 8 comments
Closed

Echo request initiated from SocketQueue every 5 minutes #50

cavebring opened this issue Dec 13, 2019 · 8 comments

Comments

@cavebring
Copy link
Contributor

So I have seen the implementation of responding to echo, but not generation of echo messages to HOST (without having any client connected).

In ISO8583 93 spec:

1804 Network Management Echo requests will be generated by the partner host system at a rate of one every five minutes. This is to verify the link integrity for diagnostic purposes only and will not affect the link status. These echo messages must not be sent at a frequency of more than one message every five minutes. Such messaging is optional if transactional data successfully traverses the H2H link since the previous 1804 / 1814 message exchange.

So we have to send echo messages if no other messages is sent within 5 minutes.

New feature or something that exists that can be modified?

@cavebring cavebring changed the title Echo request from SocketQueue Echo request initiated from SocketQueue every 5 minutes Dec 13, 2019
@juks
Copy link
Owner

juks commented Dec 14, 2019

You can use the test client (https://github.com/juks/iso-8583-socket-queue#iso-host-emulation-and-self-test-clients). Just need to point to the upstream. It will send the given packages no matter it there were an exchange, but it is not a big overhead.

@cavebring
Copy link
Contributor Author

I think I will add this feature and push it up to you. Would be good with this feature implemented.

Just give me some directions on the following:

  • Is there any global object containing information about last transaction?
  • Is there any global timer method that runs in the code I can append to?
  • Which is the process that "owns and connects" to the host logic files?

@juks
Copy link
Owner

juks commented Dec 15, 2019

I thing a good way to start is to start with simple, then move on. The simple point could be in making some improvements to the test client, like configuration options for various packet types and fields. Now it is all hardcoded. Then provide some changeable options for the packet interval.

This will do the basic job: every system administrator will be able to set the interval and the payload being sent periodicaly.

The test client is here: https://github.com/juks/iso-8583-socket-queue/blob/master/lib/testSuite/lib/testClient.js.

The main logic for upstreaming the data is here:

socket.write(Buffer.concat(buf));
But breaking in there really not worth of keeping one packet one 1 five minutes. There might be some degug complications. Ther should be a timer, and timer-related work and other stuff.

On my experience it was always accomplished by just sening this echo packet each X minutes no matter what. By the way, if the ISO host will close the connection — not a big deal, the queue will work fine, we'll reconnect, no packets will get lost.

@cavebring
Copy link
Contributor Author

Yes, I think I will just add a timer and send a packet every 5 minute regardless of transactions or not. Will work something out. Thanks!

@cavebring
Copy link
Contributor Author

I'm trying to access upstream socket from the host logic:

File: logic/myhost.js

Iso8583Logic.prototype.upstreamEcho = function(stan) {
  
  var now = moment(new Date());
  var p = new iso8583Packet();
  p.setFields({
    0:   1804,
    3:   "000000",
    11:  stan,
    12:  now.format("YYMMDDHHmmss"),                    
    24:  831,
    32:  "01008600998"
  });

  this.upstream.socket.write(p); // <---- how do I reach socket for upstream in this function?
  
}
/Users/xxxxx/iso-8583-socket-queue/lib/iso8583/lib/logic/myhost.js:171
  this.socket.write(Buffer.concat(p));
              ^

TypeError: Cannot read property 'write' of undefined
    at Iso8583Logic.upstreamEcho (/Users/xxxxx/iso-8583-socket-queue/lib/iso8583/lib/logic/myhost.js:171:15)

@juks
Copy link
Owner

juks commented Dec 16, 2019

You can do this.upstream.sendData(this, p);

@scalpovich
Copy link

Hi @cavebring
I think we deal with same iso host system. I was made some customization in order to deal with my host to.
First you have to define the echotest iso logic in your global logic.
Then in the upstream.js, Try this for periodic echo test:

var echoTestTimout = 300000; // 300000 correspond to 5min in ms

         var echoTest = parent.logic.sentUpstreamEcho();
           dd('Key exchange ok ...Sent first echo test request to Upstream ....' , 'verbose');
           dd('-----------------' + echoTest.pretty(), 'verbose');
      if (echoTest) this.write(echoTest.getMessage({
                                  staticHeader: global.c['useStaticHeader'],
                                  lengthHeader: global.c['useLengthHeader']
                              }));
          setTimeout(function() {
        dd('Sent echo test request to Upstream ..../5min after..' , 'verbose');
        dd('-----------------' + echoTest.pretty(), 'verbose');
       if (echoTest)  this.write(echoTest.getMessage({
          staticHeader: global.c['useStaticHeader'],
          lengthHeader: global.c['useLengthHeader']
        }));
        }.bind(this)
          , echoTestTimout);

@cavebring
Copy link
Contributor Author

Lovely, thank you @scalpovich !

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants