Giter VIP home page Giter VIP logo

iso-8583-socket-queue's Introduction

SocketQueue

This is a free ISO 8583 gateway (bridge) implementation for banking/fintech POS systems communication. The project is powered by Node.js (https://nodejs.org/).

The Idea

SocketQueue acts as a gateway between bank ISO 8583 system and customer applications/processes that need to talk to it. The service keeps one "host-to-host" connection with the bank processing host, that is used to transfer data, sent by multiple local clients in various representations. In terms of POS processing systems "host-to-host" connection means all the data is sent and received via single full-duplex socket asynchronously.

The recieved data is assigned to appropriate sender using the TID (Terminal Id) and STAN (System Trace Audit Number). If there are two clients sending payments transactions using the same TID, the second packet will be queued until the first one is processed or timed out. This is not normal/legal operation mode in terms of International Payments Systems, but some small fintech startups may have to accept it due to the greediness of some of the acquiring banks.

                                        +---------------+
   +-------------------+                |               | <--JSON 8583--> POS HTTP client
   | Bank POS ISO HOST | <--ISO 8583--> |  SocketQueue  | <--ISO 8583---> POS binary client
   +-------------------+                |               | <--HTTP HEX---> POS HTTP client
                                        +---------------+

Features

  • Multiplexing connection manager;
  • Modern and friendly JSON interface to aged or unfriendly ISO 8583 processing hosts;
  • Host-to-Host on the left hand (one permanent TCP connection), Host‑to‑POS (many TCP connections) on the right;
  • Supports both binary ISO 8583 and JSON over HTTP operation modes at the same time;
  • ISO 8583 validation, ISO 8583 values padding;
  • Customizable ISO 8583 syntax;
  • Safe data/events logger (console, files, LogStash);
  • Message queue;
  • TID queueing (wait for busy TID);
  • Auto-reversal implementation;
  • Socket Bank (emulates the ISO host);
  • Test clients (self test mode);
  • Stats Server (current transactions amount, MTI stats);
  • Solves the SmartVista weird transactions mishandling;
  • Lighweight, PCI-DSS friendly, reliable, event based. Hundreds of concurrent connections/transactions at a time;
  • Bonus: prevents remote ISO hosts crashes caused by PCI-DSS automated security scanning procedures.

Installation (works both for Linux and Windows)

SocketQueue is tested in production to work for months, processing thousands of transactions a day without crashes or memory leaks. I recommend running it under the Supervisor utility https://github.com/Supervisor/supervisor. Sample supervisor config may look like:

[program:socketqueue]
command=node ./socketQueue.js -c config.json
directory=/path/to/socketqueue
autostart=true
autorestart=true
startsecs=5
startretries=3
stopsignal=TERM
stopwaitsecs=10

Basic Usage

To get familiar with all the command line and configuration file parameters available, run SocketQueue with --help option:

$ node socketQueue.js --help

To establish the gateway to remote ISO host on 10.0.0.1:5000, that accepts binary ISO 8583 messages, run the module as following:

$ node socketQueue.js --upstreamHost=10.0.0.1 --upstreamPort=5000 --listenPort=2014

To add verbosity and log data into a file use:

$ node socketQueue.js --upstreamHost=10.0.0.1 --upstreamPort=5000 --listenPort=2014 --vv --logFile=log.txt

To make it silent in console, use --silent option:

$ node socketQueue.js --upstreamHost=10.0.0.1 --upstreamPort=5000 --listenPort=2014 --vv --logFile=log.txt --silent

You may keep all the options inside the configuration file, and run the SocketQueue just like that:

$ node socketQueue.js --c=config.json

Where config.json contains:

{
    "upstreamHost":    "10.0.0.1",
    "upstreamPort":    5000,
    "listenPort":      2014,
    "vv":              true,
    "logFile":         "log.txt"
}

Binary ISO 8583 service

SocketQueue provides the service for the POS transactions, sent as ISO 8583 messages. Each valid ISO 8583 message, sent by client is sent to ISO host. Each ISO host response is sent back to the client as ISO 8583 message. To run ISO 8583 gateway on certain port, use the --listenPort parameter.

Each message consists of three parts: the MTI (Message Type Indicator), Binary Mask (lists the fields, being sent) and the fields values. You may find more detailed sytax description on Wiki page https://en.wikipedia.org/wiki/ISO_8583

HTTP JSON Service

SocketQueue understands the ISO 8583 transactions, sent as JSON object. Each valid message is converted to ISO 8583 string, values are padded where necessary. The message then goes to ISO host. The ISO host responses are converted back to JSON object and sent back to clients.

To run the HTTP server use --listenHttpPort option with the port number to listen on.

$ node socketQueue.js --upstreamHost=10.0.0.1 --upstreamPort=5000 --listenHttpPort=8080 --vv --logFile=log.txt

When it is running on port 8080, you can test it like this with the "purchase" EMV transcation data:

$ curl -H "Content-Type: application/json" -X POST -d '{ "0": "0200",  "3": "0",  "4": 1000,  "7": "0818160933",  "11": 618160,  "12": "150820130600",  "22": "056",  "24": "200",  "25": "00",  "35": "4850781234567891=19082012232800000037",  "41": 992468,  "42": 124642124643,  "49": "810",  "55": "9f2608571f1e10d4fa4aac9f2701809f100706010a03a4b8029f37045bb074729f3602000c950500800010009a031508189c01009f02060000000010005f2a02064382023c009f1a0206439f03060000000000009f3303e0f0c89f34034403029f3501229f1e0835313230323831358407a00000000310109f41030000565f340101" }' http://localhost:8080

In case of success you will get the following response

{
   "result":{
      "0": "0210",
      "1": "723005802ec08200",
      "2": "4850780000478123",
      "3": 0,
      "4": 1000,
      "7": "0820130546",
      "11": "618160",
      "12": "150820130600",
      "22": "056",
      "24": 200,
      "25": 0,
      "35": "4850781234567891=19082012232800000037",
      "37": "708981921851",
      "38": "VaHYUU",
      "39": 0,
      "41": "00992468",
      "42": "000124642124643",
      "49": 643,
      "55": "9f2608571f1e10d4fa4aac9f2701809f100706010a03a4b8029f37045bb074729f3602000c950500800010009a031508189c01009f02060000000010005f2a02064382023c009f1a0206439f03060000000000009f3303e0f0c89f34034403029f3501229f1e0835313230323831358407a00000000310109f41030000565f340101"
   },
   "errors":[]
}

In case you have verbose output or logging enabled, the following messages will be logged (test performed using the local echo server):

2015-08-31 18:22:57 - info: New HTTP socket                         
2015-08-31 18:22:57 - info: Client http:127.0.0.1:53578 connected                         
2015-08-31 18:22:57 - info: Client http:127.0.0.1:53578 sent data                         
2015-08-31 18:22:57 - verbose: 

http:127.0.0.1:53578
================================================================================================

     [Purchase Request]

     Message Type Indicator [0].......................0200
     Bitmap [1].......................................3230058020c08200
     Processing Code [3]..............................0
     Amount, Transaction [4]..........................1000
     Transmission Date and Time [7]...................0818160933
     System Trace Audit Number [11]...................618160
     Time, Local Transaction [12].....................150831182300
     Pos Entry Mode [22]..............................056 (Card Data Input Mode: <Integrated circuit card read; CVV data reliable>; Cardholder Auth Method: <Signature Based>)
     Function Code [24]...............................200
     Pos Condition Code [25]..........................00
     Track 2 Data [35]................................485078******7891=19082012232800000037
     Card Acceptor Terminal Identification [41].......00992468
     Merchant Id [42].................................000124642124643
     Currency code, transaction [49]..................643
     EMV Data [55]....................................9f2608571f1e10d4fa4aac9f2701809f100706010a03a4b8029f37045bb074729f3602000c950500800010009a031508189c01009f02060000000010005f2a02064382023c009f1a0206439f03060000000000009f3303e0f0c89f34034403029f3501229f1e0835313230323831358407a00000000310109f41030000565f340101

================================================================================================

                         
2015-08-31 18:22:57 - info: Writing to queue http:127.0.0.1:53578 [0]                         
2015-08-31 18:22:57 - info: New queue item 1                         
2015-08-31 18:22:57 - info: Processing queue [pending 1 / total 1]                         
2015-08-31 18:22:57 - info: Upstreaming data for http:127.0.0.1:53578                         
2015-08-31 18:22:57 - verbose: [02630200...]                         
2015-08-31 18:22:57 - info: Echo server got data                         
2015-08-31 18:22:57 - info: Replying to client 00992468                         
2015-08-31 18:22:57 - info: Echo server sent response                         
2015-08-31 18:22:57 - info: Got data from ISO-host (306b)                         
2015-08-31 18:22:57 - verbose: [03020210...]                         
2015-08-31 18:22:57 - info: Parsed data for http:127.0.0.1:53578                         
2015-08-31 18:22:57 - verbose: 

ISO host to http:127.0.0.1:53578
================================================================================================

     [Purchase Response]

     Message Type Indicator [0].......................0210
     Bitmap [1].......................................723005802ec08200
     Primary Account Number [2].......................485078******7891
     Processing Code [3]..............................0
     Amount, Transaction [4]..........................1000
     Transmission Date and Time [7]...................0831182257
     System Trace Audit Number [11]...................618160
     Time, Local Transaction [12].....................150831182300
     Pos Entry Mode [22]..............................056 (Card Data Input Mode: <Integrated circuit card read; CVV data reliable>; Cardholder Auth Method: <Signature Based>)
     Function Code [24]...............................200
     Pos Condition Code [25]..........................0
     Track 2 Data [35]................................485078******7891=19082012232800000037
     Retrieval Reference Number [37]..................347408919250
     Approval code [38]...............................2Ttb0c
     Response code [39]...............................0 (Successful Transaction)
     Card Acceptor Terminal Identification [41].......00992468
     Merchant Id [42].................................000124642124643
     Currency code, transaction [49]..................643
     EMV Data [55]....................................9f2608571f1e10d4fa4aac9f2701809f100706010a03a4b8029f37045bb074729f3602000c950500800010009a031508189c01009f02060000000010005f2a02064382023c009f1a0206439f03060000000000009f3303e0f0c89f34034403029f3501229f1e0835313230323831358407a00000000310109f41030000565f340101

================================================================================================

Also, there is a /raw URL that accepts HEX-encoded data.

Here goes an example for the following message:

08002220010000800000990000083020354500000183100000001

That can get transmitted over HTTP as:

$ curl -H "Content-Type: text/plain" -X POST -d '303830302220010000c00000303030303030303630373136313730303132333435363030303030313233343536313233353637383930313234353637' http://localhost:8080/raw

ISO Host Emulation and “Self Test” Clients

Using --echoServerPort parameter, you can run the local ISO host emulator that supports basic operations like 800 (echo), 200 (purchase) and 400 (reversal). To emulate the real client connections/requests process you can add the --testClients option. Do not forget to supply it with --testTargetHost and --testTargetPort.

The following example shows two separate instances of SocketQueue running, but you can also stack all parameters in one line and start only one copy.

The upstream and echo servers two in one:

$ node socketQueue.js --upstreamHost=localhost --upstreamPort=5000 --listenPort=2014 --vv --echoServerPort=5000

Emulate 10 clients:

$ node socketQueue.js --testTargetHost=localhost --testTargetPort=2014 --testClients=10 --vv

Or you can run only the echo server with so called "Socket Bank" onboard:

$ node socketQueue.js --vv --echoServerPort=5000

Collecting the Statistics

The option --statServerPort enables the statistics module and starts the stat server on given port number, that collects the following statistics of while SocketQueue accepts ISO 8583 transactions:

Parameter Meaning
securedAmount sucessful transactions amount minus refund and reversal amount
processedAmount total transactions amount, including failed transactions
refundAmount total amount of refund transactions
reversalAmount total amount of reversal transactions
faultStat error codes statistics
packetCount packet count, both total and by each MTI type that was handled during the operation

So, if stats server is running on port 4000, telnet 4000 will give json stats, that may look like this:

{
   "securedAmount":1383554.49,
   "processedAmount":1876911.69,
   "refundAmount":0,
   "reversalAmount":3460,
   "faultStat":{
      "5": 2,
      "100": 7,
      "103": 1,
      "116": 3,
      "117": 1,
      "120": 10
   },
   "packetCount":{
      "total": 2265,
      "0800": 730,
      "0810": 724,
      "0200": 367,
      "0210": 364,
      "0400": 48,
      "0410": 32
   }
}

This is just fine to use with Zabbix, Kibana or other monitoring tools.

Compatibility

One can consider SocketQueue to work with SmartVista and OpenWay processing systems.

Signals

SocketQueue treats just fine the TERM, INT and HUP signals. It gracefully quits on TERM/INT and resets the stats/reopens log file on HUP signal.

“Graceful quit” means that before quitting:

  • there will be no new connections from POS clients accepted
  • active transactions responses will be delivered
  • given amount of auto-reversal requests (if enabled) will be performed.

To force process termination at any time, give it a KILL signal.

ISO 8583 echo host

There is a public demo instance of SocketQueue running on the following address:

  • askarov.com:12345 - raw upstream
  • askarov.com:12346 - HTTP JSON upstream

You can use sample payload to talk to echo host in raw mode:

$ cat ./sample_payloads/sv_800_echo.txt - | nc askarov.com 12345

For HTTP JSON:

$ curl -H "Content-Type: application/json" -X POST -d '{ "0": "800", "3": "0", "7": "0607161700", "11": "123456", "24": "0", "41": "00123456", "42": "123567890124567" }' http://askarov.com:12346

Running on Docker

Config

Create a dummy config like so

echo '{
    "upstreamHost":    "10.0.0.1",
    "upstreamPort":    5000,
    "listenPort":      2014,
    "vv":              true,
    "logFile":         "log.txt"
}
' > sample-config.json

Build image

docker build -t socket-queue:latest .

Run it

docker run -v `pwd`/sample-config.json:/etc/socket-queue/config.json -t socket-queue:latest -c /etc/socket-queue/config.json

Docker Compose

This will create a docker container and run it in three different configurations:

  1. SocketQueue Server listening on 2014
  2. SocketQueue Echo Server listening on port 5000
  3. SocketQueue Test Client emulating 10 clients
docker-compose up

Commercial collaboration

Feel free to send your inquiries about commercial collaboration (such as payment systems integration, POS Android/iOS applications development and other payment solutions) to [email protected].

Reporting Bugs

Please report bugs in the Github issue tracker: https://github.com/juks/SocketQueue/issues

Copyright

Copyright (c) 2015–2023 Igor Askarov ([email protected]). See License file for details.

iso-8583-socket-queue's People

Contributors

cavebring avatar ekoeryanto avatar juks avatar mjallday avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

iso-8583-socket-queue's Issues

Packer for field 53

What the packer I can use for field 53?
In specification this field consist from two sub fields f53a – lenght and f53b – data.

Field 53: Security Related Control Information
Subfield 53a: Key Length
Format
n 2
Description
In request and response messages this field contains length of Subfield 53b;
Host should send Subfield 53a in the response message to POS terminal if terminal sent valid
Subfields 53a and 53b in the request message to host. The key length in response message can be
single length (8 byte), double length (16 bytes) or triple length (24 bytes) if key is in BCH
representations.
Subfield 53b: Key Information
Format
b 8/16/24
Description
In request messages this subfield identifies maximum key length for key change transactions.
Valid values are: 01 – single, 02 – double, 03 – triple key length. NOTE: The lengths have been
converted to reflect their BCH representations.
In response messages this subfield identifies security management information used in the
current transaction or specifies security management information to be used in future transactions.
This field is currently being used to supply new keys to devices for key change transactions. These
keys can be either Single Des (8bytes) or Triple Des (16 or 24 bytes). NOTE: The lengths have been
converted to reflect their BCH representations.

This is my "tmp" packager config for field 53:

'53': {
length: 24,
name: 'Security Related Control Information',
type: 'b',
alias: ''

In the example problem in response message where field53 not seems like not binary:
cat ./800_TAK.txt - | nc localhost 2014

2017-07-21 13:07:35 - info: Important: starting...
2017-07-21 13:07:35 - info: Remote host configuration name: tmp
2017-07-21 13:07:35 - info: Connecting to upstream server localhost:5000
2017-07-21 13:07:35 - info: Relay raw ISO-8583 server is now running on port 2014
2017-07-21 13:07:35 - info: Echo server is now running on port 5000

2017-07-21 13:07:35 - info: Connected to upstream 127.0.0.1:5000!
2017-07-21 13:07:35 - info: Processing queue [pending 0 / total 0]
2017-07-21 13:07:35 - info: The queue is empty
2017-07-21 13:07:38 - info: Client ::1:34696 connected
2017-07-21 13:07:38 - info: Client ::1:34696 sent data (49b)
2017-07-21 13:07:38 - verbose: [0800........9900000619000000123456815170B0100000.]
2017-07-21 13:07:38 - verbose:

::1:34696

 [Echo Request]

 Message Type Indicator [0].......................0800
 Bitmap [1].......................................2220010800800800
 Processing Code [3]..............................990000
 Transmission Date and Time [7]...................0619000000
 System Trace Audit Number [11]...................123456
 Function Code [24]...............................815
 Batch Number [29]................................170
 Card Acceptor Terminal Identification [41].......B0100000
 Security Related Control Information [53]........02

================================================================================================

2017-07-21 13:07:38 - info: Writing to queue ::1:34696 [0]
2017-07-21 13:07:38 - info: New queue item 1
2017-07-21 13:07:38 - info: Processing queue [pending 1 / total 1]
2017-07-21 13:07:38 - verbose: Queue keys dump: 1
2017-07-21 13:07:38 - info: Upstreaming data for ::1:34696
2017-07-21 13:07:38 - verbose: [.....00490800........9900000619000000123456815170B0100000.]
2017-07-21 13:07:38 - verbose: [60 00 00 09 99 30 30 34 39 30 38 30 30 22 20 01 08 00 80 08 00 39 39 30 30 30 30 30 36 31 39 30 30 30 30 30 30 31 32 33 34 35 36 38 31 35 31 37 30 42 30 31 30 30 30 30 30 02]
2017-07-21 13:07:38 - info: Echo server got data
2017-07-21 13:07:38 - info: Replying to client B0100000
2017-07-21 13:07:38 - info: Echo server sent response
2017-07-21 13:07:38 - info: Got data from ISO-host (72b)
2017-07-21 13:07:38 - verbose: [.....00630810........9900000721130738123456170410758002020000B0100000NAN]
2017-07-21 13:07:38 - verbose: [60 00 00 09 99 30 30 36 33 30 38 31 30 22 20 00 08 0a 80 08 00 39 39 30 30 30 30 30 37 32 31 31 33 30 37 33 38 31 32 33 34 35 36 31 37 30 34 31 30 37 35 38 30 30 32 30 32 30 30 30 30 42 30 31 30 30 30 30 30 4e 41 4e]
2017-07-21 13:07:38 - info: Upstream error: ISO host sent data with no client connected! Ignoring...

ISO host says

 [Echo Response]

 Message Type Indicator [0].......................0810
 Bitmap [1].......................................222000080A800800
 Processing Code [3]..............................990000
 Transmission Date and Time [7]...................0721130738
 System Trace Audit Number [11]...................123456
 Batch Number [29]................................170
 Retrieval Reference Number [37]..................410758002020
 Response code [39]...............................0 (Successful Transaction)
 Card Acceptor Terminal Identification [41].......B0100000
 Security Related Control Information [53]........4e414e

================================================================================================

Auto Reversal OpenWay

Does auto reversal already implemented in OpenWay?
I see in logic/openWay.js some todo staff about implementing auto-reversal.

Failed to parse iso8583 packet.

I started ISO Host Emulation and “Self Test” Clients:

node socketQueue.js --upstreamHost=localhost --upstreamPort=5000 --listenPort=8080 --vv --echoServerPort=5000

I used your example:

curl -H "Content-Type: application/json" -X POST -d '{ "0": "0200", "3": "0", "4": 1000, "7": "0818160933", "11": 618160, "12": "150820130600", "22": "056", "24": "200", "25": "00", "35": "4850781234567891=19082012232800000037", "41": 992468, "42": 124642124643, "49": "810", "55": "9f2608571f1e10d4fa4aac9f2701809f100706010a03a4b8029f37045bb074729f3602000c950500800010009a031508189c01009f02060000000010005f2a02064382023c009f1a0206439f03060000000000009f3303e0f0c89f34034403029f3501229f1e0835313230323831358407a00000000310109f41030000565f340101" }' http://localhost:8080

I got this error:

2016-08-31 22:43:34 - info: The queue is empty
2016-08-31 22:43:39 - info: Client ::1:6798 connected
2016-08-31 22:43:39 - info: Client ::1:6798 sent data (656b)
2016-08-31 22:43:39 - verbose: [POST...H...]
2016-08-31 22:43:39 - info: ::1:6798: Warning! Failed to parse iso8583 packet. W
on't queue!
2016-08-31 22:43:39 - info: Client ::1:6798 <end> event
2016-08-31 22:43:39 - info: Client ::1:6798 <close> event

It seems to work previously....

Iso8583 packet contains errors. Won't queue!

Hi
While i am testing your project (which an amazing work BTW) i got this error
Iso8583 packet contains errors. Won't queue!after trying to send the following iso8583 message (after hex encoding of course)

0200723A4001084180021666666612345678905610000000010010000327110332000981180332032703286011040014000980000000000012123036123456000012345678900000100000028000288

the server recognize most of the fields but it shows

================================================================================================
     Message Type Indicator [0].......................0200
     Bitmap [1].......................................3732334134303031
     Processing Code [3]..............................84180
     Amount, Transaction [4]..........................21666666612
     Amount, Cardholder Billing [6]...................345678905610
     Transmission Date and Time [7]...................0000000100
     Amount, Cardholder Billing Fee [8]...............10000327
     System Trace Audit Number [11]...................110332
     Time, Local Transaction [12].....................000981180332
     Date, Settlement [15]............................327
     Function Code [24]...............................32
     Acquiring Institution Ident Code [32]............01104001400
     Track 2 Data [35]................................800000000
     Approval code [38]...............................000121
     Personal Identification Data [52]................0361234
     Primary MAC Data [64]............................56000012

================================================================================================
Errors:
     No field 22
     No field 25
     No field 41
     No field 42
     No field 49
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

I got the same behavior for other hex messages

Send mesage to external upstream without httpclient

Hi Igor,
Hope you're doing well.
i use SQ now it's really amazing. Thanks
How can i send a message to an external upstream server without a client connect.
For example i use SQ to connect to a upstream server. In specs of this server.. at every connection the upstream server must send to me (here SQ) a 0800 message and i should response automaticaly after make some verification by 0810
Actually when i receive the request 0800 from upstream , SQ log error as ISO host send data with no client.
The concerned upstream server connection specifications describe:

  1. Socket must send 0800 to upstream server
  2. upstream server response 0810 and automatically send 0800 with an additionnal data (DE48)
  3. SQ must verify the value of the additionnal data (DE48) and send a 0810 as response with responseCode 0 and must send automatically new 0800
  4. After this exchange done correctly , the upstream server it ready to receive and authorize transactions request from SQ client
    Can you Assist please

Reached queue timeout

Hi Igor,

We try use SocketQueue connect to our backend ISO.
Our backend IP is 10.225.16.48, and the service at the backend listening on port 333.

We start the SocketQueue with this below command:
node socketQueue.js --upstreamHost=10.225.16.48 --upstreamPort=333 --listenHttpPort=8080 --echoServerPort=333 --vv --logFile=log.txt

But, when we try to simulate send the request:
curl -H "Content-Type: application/json" -X POST -d '{ "0": "0800", "3": "1", "7": "1112070616", "11": "436014", "24": "1", "41": "1", "70": "001"}' http://127.0.0.1:8080

We got queue timeout.
We figure out, the SocketQueue doen't sent our requested message to our backend (10.225.16.48).

2017-11-12 08:26:20 - info: Writing to queue http:::1:57404 [0]
2017-11-12 08:26:20 - info: New queue item 2
2017-11-12 08:26:20 - info: Processing queue [pending 1 / total 1]
2017-11-12 08:26:20 - verbose: Queue keys dump: 2
2017-11-12 08:26:20 - info: Upstreaming data for http:::1:57404
2017-11-12 08:26:20 - verbose: [00560800...]
2017-11-12 08:26:55 - info: Queue notice: http:::1:57404 reached queue timeout
2017-11-12 08:26:55 - info: Dropping the client http:::1:57404
2017-11-12 08:26:55 - info: Client http:::1:57404 gateway timeout
2017-11-12 08:26:55 - info: Client http:::1:57404 event
2017-11-12 08:26:55 - verbose: Releasing terminal 00000003 with the key 2
2017-11-12 08:26:55 - info: Warning: client http:::1:57404 [queue id 2] terminated activity
2017-11-12 08:26:55 - info: Processing queue [pending 0 / total 0]
2017-11-12 08:26:55 - info: The queue is empty

N.B:
-No firewall between SocketQueue to the backend.
-We test connection using telnet is successful.

Please help.
Thanks

Socket is not connected yet

Hi Igor,

Need your help again :-).
In my previous question, i only test the sign-on message only, and sign-on/echo message is working fine.
But when i sent the transaction, SQ doesn't give any response.

SQ command:
node socketQueue.js --upstreamHost=127.0.0.1 --upstreamPort=333 --listenHttpPort=8080 --vv --logFile=log.txt --lengthHeaderType=hex --overrides=1:bitmap-hex:8,39:fixed-n:2 --hostConfig upg

http post data:
{ "0": "0100", "3": "182000", "4":"000002500000", "11": "398621", "12": "193006", "13": "0116", "22": "018", "32": "005", "37": "000317155212", "41": "00000882", "43": "Internet", "48": "1010 000000025000", "49": "360", "98":"087882837160" }

SQ log:

http:::ffff:127.0.0.1:41164
================================================================================================
     Message Type Indicator [0].......................0100
     Bitmap [1].......................................b038040108a180000000000040000000
     Processing Code [3]..............................182000
     Amount, Transaction [4]..........................000002500000
     System Trace Audit Number [11]...................398621
     Time, Local Transaction [12].....................000000193006
     Date, Local Transaction [13].....................0116
     Pos Entry Mode [22]..............................018 (Card Data Input Mode: <Manual>)
     Acquiring Institution Ident Code [32]............005
     Retrieval Reference Number [37]..................000317155212
     Card Acceptor Terminal Identification [41].......00000882
     Merchant Location [43]...........................Internet
     Additional Data [48].............................1010  000000025000
     Currency code, transaction [49]..................360
     Payee [98].......................................087882837160

================================================================================================

                         
2018-06-08 09:48:50 - info: Writing to queue http:::ffff:127.0.0.1:41164 [0]                         
2018-06-08 09:48:50 - info: New queue item 16                         
2018-06-08 09:48:50 - info: Processing queue [pending 1 / total 1]                         
2018-06-08 09:48:50 - verbose: Queue keys dump: 16                         
2018-06-08 09:48:50 - info: Upstreaming data for http:::ffff:127.0.0.1:41164                         
2018-06-08 09:48:50 - verbose: [..0100b0...]                         
2018-06-08 09:48:50 - info: Upstream <end>                         
2018-06-08 09:48:50 - info: Upstream <close>                         
2018-06-08 09:48:50 - info: Dropping all active clients                         
2018-06-08 09:48:50 - info: Connecting to upstream server 127.0.0.1:333                         
2018-06-08 09:48:50 - info: Processing queue [pending 0 / total 1]                         
2018-06-08 09:48:50 - verbose: Queue keys dump: 16                         
2018-06-08 09:48:50 - info: Socket is not connected yet...                         
2018-06-08 09:48:50 - info: Connected to upstream 127.0.0.1:333!                         
2018-06-08 09:48:50 - info: Processing queue [pending 0 / total 1]                         
2018-06-08 09:48:50 - verbose: Queue keys dump: 16                         
2018-06-08 09:48:50 - info: Client http:::ffff:127.0.0.1:41164 <close> event                         
2018-06-08 09:48:50 - verbose: Releasing terminal 00000882 with the key 16                         
2018-06-08 09:48:50 - info: Warning: client http:::ffff:127.0.0.1:41164 [queue id 16] terminated activity                         
2018-06-08 09:48:50 - info: Processing queue [pending 0 / total 0]                         
2018-06-08 09:48:50 - info: The queue is empty 

Note: I add new MTI 0100 in the packager "upg"

Why SQ printed out "Socket is not connected yet.."?
Can we set SQ send echo message regularly into host?

Please help...

Upstream error: ISO host sent data with no client connected!

I get the error Upstream error: ISO host sent data with no client connected! every time I try to send data (just using postman):

Send:

{
	"0":"1804",
	"3":"000000",
	"11":"000004",
	"12":"191213185350",
	"24":"831"
}

Response:

{
    "result": "",
    "errors": [
        "Gateway timeout"
    ]
}
2019-12-13 18:53:42 - : New HTTP socket                         
2019-12-13 18:53:42 - : Client http:::ffff:172.31.41.152:63623 connected                         
2019-12-13 18:53:42 - : Client http:::ffff:172.31.41.152:63623 sent data                         
2019-12-13 18:53:42 - : 

http:::ffff:172.31.41.152:63623
================================================================================================

     [Echo Response]

     Message Type Indicator [0].......................1804
     Bitmap [1].......................................2030010000000000
     Processing Code [3]..............................000000
     System Trace Audit Number [11]...................000004
     Time, Local Transaction [12].....................191213185350
     Function Code [24]...............................0831

================================================================================================

                         
2019-12-13 18:53:42 - : Writing to queue http:::ffff:172.31.41.152:63623 [0]                         
2019-12-13 18:53:42 - : New queue item 6                         
2019-12-13 18:53:42 - : Processing queue [pending 1 / total 1]                         
2019-12-13 18:53:42 - : Queue keys dump: 6                         
2019-12-13 18:53:42 - : Upstreaming data for http:::ffff:172.31.41.152:63623                         
2019-12-13 18:53:42 - : [.....0................SP.1]                         
2019-12-13 18:53:42 - : [00 18 18 04 20 30 01 00 00 00 00 00 00 00 00 00 00 04 19 12 13 18 53 50 08 31]                         
2019-12-13 18:53:42 - : Got data from ISO-host (24b)                         
2019-12-13 18:53:42 - : [.....0................SP]                         
2019-12-13 18:53:42 - : [00 16 18 14 20 30 00 00 00 00 00 00 00 00 00 00 00 04 19 12 13 18 53 50]                         
2019-12-13 18:53:42 - : Upstream error: ISO host sent data with no client connected! Ignoring...

ISO host says
================================================================================================

     [Echo Response]

     Message Type Indicator [0].......................1814
     Bitmap [1].......................................2030000000000000
     Processing Code [3]..............................000000
     System Trace Audit Number [11]...................000004
     Time, Local Transaction [12].....................191213185350

================================================================================================

                         
2019-12-13 18:53:42 - : Processing queue [pending 0 / total 1]                         
2019-12-13 18:53:42 - : Queue keys dump: 6                         
2019-12-13 18:54:17 - : Queue notice: http:::ffff:172.31.41.152:63623 reached queue timeout                         
2019-12-13 18:54:17 - : Dropping the client http:::ffff:172.31.41.152:63623     

Any idea?

New Feature Request: ISO8583 to Upstream HTTP JSON Mapping

Hi,

It would be nice to incorporate a reverse functionality to existing HTTP JSON Service wherein an upstream service could be a REST interface and a ISO8583 request could be mapped to REST field by name such as

ISO Request:
Message Type Indicator [0].......................1210
Bitmap [1].......................................F23005418AE080000000000004000000
Primary Account Number [2].......................1140463000
Processing Code [3]..............................400201
Amount, Transaction [4]..........................50100
Transmission Date and Time [7]...................20170627104904

Upstream Mapping:
{
"0": "1210",
"1": "F23005418AE080000000000004000000",
"2": "1140463000",
"3": "400201",
"4": "50100",
"7": "20170627104904"
}

Socket Queue cryptographic keys exchange

Hi Igor,
Hope you're doing well.
i use SQ now it's really amazing. Thanks
How can i implement a connection module to an HSM for the exchange of cryptographic keys to secure online transactions in currently architecture?

Upstream error: ISO host sent data with no client connected! Ignoring..

Hi,

What could be the reason for this error?

Have modified smartVista.js as per our service specs and able to get request formatted and succesfully sent to the server. But the response though it's correctly begin logged on the console gives below error.

Upstream error: ISO host sent data with no client connected! Ignoring..

I used nc for testing and the above error is returned.
cat custom_1200_a2a.txt - | nc 0.0.0.0 2014

How to configure useLengthHeader and useStaticHeader

Hi!
I try to configure work with useLengthHeader and useStaticHeader, but have errors with examle request: cat ./sv_800_echo_header.txt - | nc localhost 2014
Details below:

cat config3.json
{
"hostConfig": "smartVista",
"smartVista": true,
"openWay": false,
"upstreamHost": "localhost",
"upstreamPort": 5000,
"listenPort": 2014,
"logFile": "log.txt",
"echoServerPort": 5000,
"vv": true,
"dangerous": true,
"useLengthHeader": true,
"useStaticHeader": ""
}

nodejs socketQueue.js --c=config3.json
2017-06-19 11:23:32 - info: Important: starting...
2017-06-19 11:23:32 - info: Remote host configuration name: smartVista
2017-06-19 11:23:32 - info: Connecting to upstream server localhost:5000
2017-06-19 11:23:32 - info: Relay raw ISO-8583 server is now running on port 2014
2017-06-19 11:23:32 - info: Echo server is now running on port 5000

2017-06-19 11:23:32 - info: Connected to upstream 127.0.0.1:5000!
2017-06-19 11:23:32 - info: Processing queue [pending 0 / total 0]
2017-06-19 11:23:32 - info: The queue is empty
2017-06-19 11:23:42 - info: Client ::1:49878 connected
2017-06-19 11:23:42 - info: Client ::1:49878 sent data (64b)
2017-06-19 11:23:42 - verbose: [00600800........000000060716170012345600000123456123567890124567]
Error unpacking data from bit 19
Packager: undefined: Unknown packager 19 Error: Unknown packager 19
at _unpack (/opt/SocketQueue/lib/iso8583/lib/iso8583.js:24:28)
at unpack (/opt/SocketQueue/lib/iso8583/lib/iso8583.js:86:23)
at new Iso8583Packet (/opt/SocketQueue/lib/iso8583-packet/lib/iso8583Packet.js:47:37)
at queue.addMessage (/opt/SocketQueue/lib/iso8583-queue/lib/iso8583Queue.js:47:11)
at Upstream.sendData (/opt/SocketQueue/lib/socketServer/lib/upstream.js:76:24)
at Socket. (/opt/SocketQueue/lib/socketServer/lib/clientSocket.js:47:21)
at emitOne (events.js:77:13)
at Socket.emit (events.js:169:7)
at readableAddChunk (_stream_readable.js:146:16)
at Socket.Readable.push (_stream_readable.js:110:10)
Error unpacking data from bit 20
Packager: undefined: Unknown packager 20 Error: Unknown packager 20
at _unpack (/opt/SocketQueue/lib/iso8583/lib/iso8583.js:24:28)
at unpack (/opt/SocketQueue/lib/iso8583/lib/iso8583.js:86:23)
at new Iso8583Packet (/opt/SocketQueue/lib/iso8583-packet/lib/iso8583Packet.js:47:37)
at queue.addMessage (/opt/SocketQueue/lib/iso8583-queue/lib/iso8583Queue.js:47:11)
at Upstream.sendData (/opt/SocketQueue/lib/socketServer/lib/upstream.js:76:24)
at Socket. (/opt/SocketQueue/lib/socketServer/lib/clientSocket.js:47:21)
at emitOne (events.js:77:13)
at Socket.emit (events.js:169:7)
at readableAddChunk (_stream_readable.js:146:16)
at Socket.Readable.push (_stream_readable.js:110:10)
Error unpacking data from bit 27
Packager: undefined: Unknown packager 27 Error: Unknown packager 27
at _unpack (/opt/SocketQueue/lib/iso8583/lib/iso8583.js:24:28)
at unpack (/opt/SocketQueue/lib/iso8583/lib/iso8583.js:86:23)
at new Iso8583Packet (/opt/SocketQueue/lib/iso8583-packet/lib/iso8583Packet.js:47:37)
at queue.addMessage (/opt/SocketQueue/lib/iso8583-queue/lib/iso8583Queue.js:47:11)
at Upstream.sendData (/opt/SocketQueue/lib/socketServer/lib/upstream.js:76:24)
at Socket. (/opt/SocketQueue/lib/socketServer/lib/clientSocket.js:47:21)
at emitOne (events.js:77:13)
at Socket.emit (events.js:169:7)
at readableAddChunk (_stream_readable.js:146:16)
at Socket.Readable.push (_stream_readable.js:110:10)
Error unpacking data from bit 28
Packager: undefined: Unknown packager 28 Error: Unknown packager 28
at _unpack (/opt/SocketQueue/lib/iso8583/lib/iso8583.js:24:28)
at unpack (/opt/SocketQueue/lib/iso8583/lib/iso8583.js:86:23)
at new Iso8583Packet (/opt/SocketQueue/lib/iso8583-packet/lib/iso8583Packet.js:47:37)
at queue.addMessage (/opt/SocketQueue/lib/iso8583-queue/lib/iso8583Queue.js:47:11)
at Upstream.sendData (/opt/SocketQueue/lib/socketServer/lib/upstream.js:76:24)
at Socket. (/opt/SocketQueue/lib/socketServer/lib/clientSocket.js:47:21)
at emitOne (events.js:77:13)
at Socket.emit (events.js:169:7)
at readableAddChunk (_stream_readable.js:146:16)
at Socket.Readable.push (_stream_readable.js:110:10)
Error unpacking data from bit 43
Packager: undefined: Unknown packager 43 Error: Unknown packager 43
at _unpack (/opt/SocketQueue/lib/iso8583/lib/iso8583.js:24:28)
at unpack (/opt/SocketQueue/lib/iso8583/lib/iso8583.js:86:23)
at new Iso8583Packet (/opt/SocketQueue/lib/iso8583-packet/lib/iso8583Packet.js:47:37)
at queue.addMessage (/opt/SocketQueue/lib/iso8583-queue/lib/iso8583Queue.js:47:11)
at Upstream.sendData (/opt/SocketQueue/lib/socketServer/lib/upstream.js:76:24)
at Socket. (/opt/SocketQueue/lib/socketServer/lib/clientSocket.js:47:21)
at emitOne (events.js:77:13)
at Socket.emit (events.js:169:7)
at readableAddChunk (_stream_readable.js:146:16)
at Socket.Readable.push (_stream_readable.js:110:10)
Error unpacking data from bit 56
Packager: undefined: Unknown packager 56 Error: Unknown packager 56
at _unpack (/opt/SocketQueue/lib/iso8583/lib/iso8583.js:24:28)
at unpack (/opt/SocketQueue/lib/iso8583/lib/iso8583.js:86:23)
at new Iso8583Packet (/opt/SocketQueue/lib/iso8583-packet/lib/iso8583Packet.js:47:37)
at queue.addMessage (/opt/SocketQueue/lib/iso8583-queue/lib/iso8583Queue.js:47:11)
at Upstream.sendData (/opt/SocketQueue/lib/socketServer/lib/upstream.js:76:24)
at Socket. (/opt/SocketQueue/lib/socketServer/lib/clientSocket.js:47:21)
at emitOne (events.js:77:13)
at Socket.emit (events.js:169:7)
at readableAddChunk (_stream_readable.js:146:16)
at Socket.Readable.push (_stream_readable.js:110:10)
2017-06-19 11:23:42 - verbose:

::1:49878

 Message Type Indicator [0].......................0060
 Bitmap [1].......................................3038303022200100
 Processing Code [3]..............................NaN
 Amount, Transaction [4]..........................6071617
 System Trace Audit Number [11]...................001234
 Time, Local Transaction [12].....................560000012345
 Date, Local Transaction [13].....................6123
 Track 2 Data [35]................................7890124567
 Response code [39]...............................NaN

================================================================================================

2017-06-19 11:23:42 - info: Writing to queue ::1:49878 [0]
2017-06-19 11:23:42 - info: New queue item 1
2017-06-19 11:23:42 - info: Processing queue [pending 1 / total 1]
2017-06-19 11:23:42 - verbose: Queue keys dump: 1
2017-06-19 11:23:42 - info: Upstreaming data for ::1:49878
2017-06-19 11:23:42 - verbose: [006400600800........000000060716170012345600000123456123567890124567]
2017-06-19 11:23:42 - verbose: [30 30 36 34 30 30 36 30 30 38 30 30 22 20 01 00 00 c0 00 00 30 30 30 30 30 30 30 36 30 37 31 36 31 37 30 30 31 32 33 34 35 36 30 30 30 30 30 31 32 33 34 35 36 31 32 33 35 36 37 38 39 30 31 32 34 35 36 37]
2017-06-19 11:23:42 - info: Echo server got data
Error unpacking data from bit 19
Packager: undefined: Unknown packager 19 Error: Unknown packager 19
at _unpack (/opt/SocketQueue/lib/iso8583/lib/iso8583.js:24:28)
at unpack (/opt/SocketQueue/lib/iso8583/lib/iso8583.js:86:23)
at new Iso8583Packet (/opt/SocketQueue/lib/iso8583-packet/lib/iso8583Packet.js:47:37)
at Socket. (/opt/SocketQueue/lib/testSuite/lib/echoServer.js:37:17)
at emitOne (events.js:77:13)
at Socket.emit (events.js:169:7)
at readableAddChunk (_stream_readable.js:146:16)
at Socket.Readable.push (_stream_readable.js:110:10)
at TCP.onread (net.js:523:20)
Error unpacking data from bit 20
Packager: undefined: Unknown packager 20 Error: Unknown packager 20
at _unpack (/opt/SocketQueue/lib/iso8583/lib/iso8583.js:24:28)
at unpack (/opt/SocketQueue/lib/iso8583/lib/iso8583.js:86:23)
at new Iso8583Packet (/opt/SocketQueue/lib/iso8583-packet/lib/iso8583Packet.js:47:37)
at Socket. (/opt/SocketQueue/lib/testSuite/lib/echoServer.js:37:17)
at emitOne (events.js:77:13)
at Socket.emit (events.js:169:7)
at readableAddChunk (_stream_readable.js:146:16)
at Socket.Readable.push (_stream_readable.js:110:10)
at TCP.onread (net.js:523:20)
Error unpacking data from bit 27
Packager: undefined: Unknown packager 27 Error: Unknown packager 27
at _unpack (/opt/SocketQueue/lib/iso8583/lib/iso8583.js:24:28)
at unpack (/opt/SocketQueue/lib/iso8583/lib/iso8583.js:86:23)
at new Iso8583Packet (/opt/SocketQueue/lib/iso8583-packet/lib/iso8583Packet.js:47:37)
at Socket. (/opt/SocketQueue/lib/testSuite/lib/echoServer.js:37:17)
at emitOne (events.js:77:13)
at Socket.emit (events.js:169:7)
at readableAddChunk (_stream_readable.js:146:16)
at Socket.Readable.push (_stream_readable.js:110:10)
at TCP.onread (net.js:523:20)
Error unpacking data from bit 28
Packager: undefined: Unknown packager 28 Error: Unknown packager 28
at _unpack (/opt/SocketQueue/lib/iso8583/lib/iso8583.js:24:28)
at unpack (/opt/SocketQueue/lib/iso8583/lib/iso8583.js:86:23)
at new Iso8583Packet (/opt/SocketQueue/lib/iso8583-packet/lib/iso8583Packet.js:47:37)
at Socket. (/opt/SocketQueue/lib/testSuite/lib/echoServer.js:37:17)
at emitOne (events.js:77:13)
at Socket.emit (events.js:169:7)
at readableAddChunk (_stream_readable.js:146:16)
at Socket.Readable.push (_stream_readable.js:110:10)
at TCP.onread (net.js:523:20)
Error unpacking data from bit 43
Packager: undefined: Unknown packager 43 Error: Unknown packager 43
at _unpack (/opt/SocketQueue/lib/iso8583/lib/iso8583.js:24:28)
at unpack (/opt/SocketQueue/lib/iso8583/lib/iso8583.js:86:23)
at new Iso8583Packet (/opt/SocketQueue/lib/iso8583-packet/lib/iso8583Packet.js:47:37)
at Socket. (/opt/SocketQueue/lib/testSuite/lib/echoServer.js:37:17)
at emitOne (events.js:77:13)
at Socket.emit (events.js:169:7)
at readableAddChunk (_stream_readable.js:146:16)
at Socket.Readable.push (_stream_readable.js:110:10)
at TCP.onread (net.js:523:20)
Error unpacking data from bit 56
Packager: undefined: Unknown packager 56 Error: Unknown packager 56
at _unpack (/opt/SocketQueue/lib/iso8583/lib/iso8583.js:24:28)
at unpack (/opt/SocketQueue/lib/iso8583/lib/iso8583.js:86:23)
at new Iso8583Packet (/opt/SocketQueue/lib/iso8583-packet/lib/iso8583Packet.js:47:37)
at Socket. (/opt/SocketQueue/lib/testSuite/lib/echoServer.js:37:17)
at emitOne (events.js:77:13)
at Socket.emit (events.js:169:7)
at readableAddChunk (_stream_readable.js:146:16)
at Socket.Readable.push (_stream_readable.js:110:10)
at TCP.onread (net.js:523:20)
2017-06-19 11:23:42 - info: Replying to client null
2017-06-19 11:23:42 - info: Echo server sent response

SocketQueue Performance/Benchmark

Hi Igor,

Could you share the performance of SocketQueue in production?
I still have a problem about TCP Socket performance for concurrent transaction (low response per second, low CPU & RAM usage).

Thank you..

Socket Queue storage location

Hi Juks,

Is it possible to configure the storage location for the queue to survive restarts? Currently When we send a request from same TID it actually gets queued, and suppose there was a system/network failure for a few seconds we will loose all the messages in the queue.

Can you please advise how is the queue mechanism implement with SocketQueue and if we can extend it to use some sort of persistent queueing technology with it.

Virtual HSM module / HSM simulator for SQ

Hi Igor,
Hope you're doing well.

It would be interesting to add a security module call HSM for Socket Queue. To manage security exchanges by sending u HSM commands for key verification.

Did you think about that? Do get some directive / idea?

How to config LengthHeader+TPDU+MSG?

Hi,
POS format = LengthHeader(2 bytes)+TPDU+02xx..... . (Hypercom /NAC message format)
My config:
{
"useLengthHeader": true,
"useStaticHeader": "6001509999" ==> It is TPDU data
}

2018-09-26 09:29:43 - : Writing to queue http:::1:54891 [0]
2018-09-26 09:29:43 - : New queue item 0
2018-09-26 09:29:43 - : Processing queue [pending 1 / total 1]
2018-09-26 09:29:43 - : Queue keys dump: 0
2018-09-26 09:29:43 - : Upstreaming data for http:::1:54891
2018-09-26 09:29:43 - : [..P..00600800........000000060718170000000100000123456123567890124567]
2018-09-26 09:29:43 - : [60 01 50 99 99 30 30 36 30 30 38 30 30 22 20 01 00 00 c0 00 00 30 30 30 30

I check log,I find msg is TPDU+LengthHeader .
How to config TCPIPLen+TPDU+MSG?
Thank you !

iso8583/93 support

Hi,

How implement the iso8583-2:1993 Protocol with this solution?

Regards.

Make gateway a server rather than client

Hi there.. first, thanks for creating this project. Its a great tool for testing these types of payment systems.
My question is in relation to the upstream host connection.
As far as I can tell, the only connection mode supported for the upstream host seems to be with SocketQueue as a client and the host (assuming SmartVista or Openway) running as server.
In my environment, our host connects to our system as a client so I would like to run the SocketQueue gateway as a server with the upstream host connecting as a client.
Is this possible with the tool and if not, is it a major change to support such an upstream configuration?

Use for iso8583 version 93

Hi Igor,
SQ is very useful
I have a question, because I want to use SQ to send a message to a version of the host ISO 8583 93.
I mean on this kind of version of ISO8583 the message type is in the form of 12XX or 18XX or 18XX
I created my own packager in but without much change in lib/iso8583/lib/packager...
Kindly assist

http request gateway timeout

Hi igor,
I get an issue with http server.
When i sent request from http sclient to SQ, i get gateway timeout.
Below SQ log. My Host respond well , SQ get the response correctly but http client never get feedback

image

Kindly assist

STAN or RRN in queue with tid

Hi, Igor.
Can you add parameter to define what field (STAN or RRN) use with tid for determinate transaction in queue.
I have work with processing that use field37 in request messages and in that case SocketQueue fail with error "Upstream error: ISO host sent data with no client connected! Ignoring..."
Example:

iso_message.txt
1100_bal.txt

Media files

This is not a task, just a place to keep files at.

BCD packer

Hi,
I need a very common packer:

Nx -x numeric digits, BCD encoded, right justified with leading half byte zero filled

So 831 would be hex 08 31

All packers I use that does BCD does calculation wrong (or I am thinking wrong), but if I use packer fixed-b which is the only I can find that does BCD and I specify length 6, and data 999999 it does hex 00 00 00 99 99 99. So I was thinking that the length is in bytes, but when I change to length 3 it instead does 00 09 99 which is so strange.

What I am expecting is that length 6, data 999999 is binary coded as hex 99 99 99, is there a current packer for this or do we need to add a BCD packer?

Implement upstream echo response

Hallo,
I am trying to implement auto reply echo request from the ISO host. When the ISO host send echo request I got this upstream error:

2018-03-26 16:47:50 - info: Upstream error: ISO host sent data with no client connected! Ignoring...

ISO host says
================================================================================================

     [Echo Request]

     Message Type Indicator [0].......................0800
     Bitmap [1].......................................82200000000000000400000000000000
     Transmission Date and Time [7]...................0326094750
     System Trace Audit Number [11]...................018386
     Network Management Information Code [70].........301

================================================================================================

Is queue based approach right for ISO gateway?

Hi Juks,

SocketQueue is really a great solution based on Nodejs and we tried testing a few implementation. All seems good except for this queuing mechanism which we would like to know the reason for.

Currently if we send 10 concurrent requests using REST on listenHttpPort, we realised that it gets queued on the Socket Queue. If each transaction is taking around 10 seconds (Upstream takes this time), it's executing the requests sequentially and takes almost 100 seconds to complete 10 requests.

So is it by design it's suppose to queue the transactions and execute sequentially or is it some kind of configuration which can be disabled so that concurrent requests could be served in parallel?

Start with config file reference error

Created a config:

{
    "upstreamHost":    "10.0.0.1",
    "upstreamPort":    5000,
    "listenPort":      2014,
    "vv":              true,
    "logFile":         "log.txt"
}

When I start, I got this error on Windows and Linux machine:

$ node socketQueue.js --c=config.json
C:\SocketQueue\socketQueue.js:46
    var val = readCfgParam(name, cfgData[name]);
              ^

ReferenceError: readCfgParam is not defined
    at Object.<anonymous> (C:\SocketQueue\socketQueue.js:46:15)

    at Module._compile (module.js:409:26)
    at Object.Module._extensions..js (module.js:416:10)
    at Module.load (module.js:343:32)
    at Function.Module._load (module.js:300:12)
    at Function.Module.runMain (module.js:441:10)
    at startup (node.js:139:18)
    at node.js:968:3

no bit 41 causing Upstream error: ISO host sent data with no client connected! Ignoring...

Hi igor,

i'm trying to implement socket queue. I run the socket queue using this command
node socketQueue.js --upstreamHost=192.168.1.35 --upstreamPort=5036 --listenHttpPort=8080 --noAutoReversal --vv --useLengthHeader --lengthHeaderType=hex --hostConfig=alto
host config file alto.txt

when I try purchase operation (0200) it's working fine, but when I try to echo / sign on (0800), it shows Upstream error: ISO host sent data with no client connected! Ignoring...
Here are my json request
{"0":"0800", "2":"6048200000002731", "7":"0109102806","11":"1", "70":"301"}

json response
{"result": "","errors": ["Gateway timeout"]}

socket queue stack trace
2018-01-11 14:56:52 - info: Client http:::1:52649 connected
2018-01-11 14:56:52 - info: Client http:::1:52649 sent data
2018-01-11 14:56:52 - verbose:

http:::1:52649

 [Echo Request]

 Message Type Indicator [0].......................0800
 Bitmap [1].......................................0400000000000000
 Primary Account Number [2].......................604820******2731
 Transmission Date and Time [7]...................0109102806
 System Trace Audit Number [11]...................000001
 Network Management Information Code [70].........301

================================================================================================

2018-01-11 14:56:52 - info: Writing to queue http:::1:52649 [0]
2018-01-11 14:56:52 - info: New queue item 2
2018-01-11 14:56:52 - info: Processing queue [pending 1 / total 1]
2018-01-11 14:56:52 - verbose: Queue keys dump: 2
2018-01-11 14:56:52 - info: Upstreaming data for http:::1:52649
2018-01-11 14:56:52 - verbose: [.I0800c2...]
2018-01-11 14:56:52 - info: Got data from ISO-host (77b)
2018-01-11 14:56:52 - verbose: [K.0810C2...]
2018-01-11 14:56:52 - info: Upstream error: ISO host sent data with no client connected! Ignoring...

ISO host says

 [Echo Response]

 Message Type Indicator [0].......................0810
 Bitmap [1].......................................0400000000000000
 Primary Account Number [2].......................604820******2731
 Transmission Date and Time [7]...................0109102806
 System Trace Audit Number [11]...................000001
 Response Code [39]...............................00 (Approve Transaction)
 Network Management Information Code [70].........301

================================================================================================

2018-01-11 14:57:27 - info: Queue notice: http:::1:52649 reached queue timeout
2018-01-11 14:57:27 - info: Dropping the client http:::1:52649
2018-01-11 14:57:27 - info: Client http:::1:52649 gateway timeout
2018-01-11 14:57:32 - info: Client http:::1:52649 event
2018-01-11 14:57:32 - verbose: Releasing terminal null with the key 2
2018-01-11 14:57:32 - info: Warning: client http:::1:52649 [queue id 2] terminated activity

based on your explanation, is it because I don't send bit 41 in the json request? or did I miss something?

I tried to send bit 41 in the echo and sign on request, but the ISO host didn't response my request

Please help
Thanks

Auto-reverse bug.

There is a case when SQ is hang up and can't take payments from terminals, that have sticked packages. The way to reproduce this bug is:

  1. Send a purchase package, after that package is sent, sender should drop connection to make the IsoLogic to work.
  2. First package generated by IsoLogic should retrieve faulty message code from IsoHost emulator, to relaunch it again.
  3. The second package generated by IsoLogic should receive no response from IsoHost emulator, then SQ will try to delete that package from queue, but SQ won't be able to do that, so this package will stick in queue, and any other request made by this TerminalID won't proceed.

use socket as client only

Hi Juks,
I want to know if i neeed some custom thingd to use SQ as client rather than host in order to connect to another ISO host
Or send an iso message through SQ from http client to an ISO host. In this case, SQ will be serve as SWITCH

Solving queue conflict

Hello,
i want to send a reversal message 3 times with the exactly same value for every bit, but i got
"Queue warning: solving queue conflict with 2 pretenders [success]"
How can i send it without changing any bit in the message im going to send ?

Thank you in advance

custom headers

hello Igor,
it is possible to use custom headers (before MTI) to send along the message?

Echo request initiated from SocketQueue every 5 minutes

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?

Custom Header & Support For EBCDIC format

Hi Igor,

I want to know how to custom header value. For Example: Header length (bytes) and option for message length includes header length.

Also is it possible to send and receive ISO8583 using EBCDIC format.?

Thanks

Sending raw message using HTTP

Can I send raw ISO 8583 message example, 02005000000000000000165419120070537139000000005500, using HTTP instead of upstream?

I saw this on the feature list: Supports both binary ISO-8583 and JSON over HTTP operation modes at the same time, do you have a sample code?

subfield data element management

Hi Igor,
It's possible to manage subfields as tag for some data element?
For exemple, field 55 contain many subfields with specific length and format.

FLD           | LENTGH    | VALUE
FLD (055) : (101) :                                                                       .
	> TAG (82  ) ....: [3C00]                                                             .
	> TAG (9F33) ....: [E0F8C8]                                                           .
	> TAG (95  ) ....: [0080008000]

Kindly assist

Incorrect Bitmap (Field 1) when using HTTP JSON Service

Hi,

When trying to use HTTP JSON service (curl) to post to SocketQueue bitmap is being set as 8 bit hex always causing issue in decomposition of the message at upstream server.

Although I have fields after 64 HTTP JSON is not appending secondary bitmap. Even if i try to send Primary + Secondary bitmap in the JSON request at the field 1 it's still not picking the same for formulating ISO message.

Bitmap in Hex

Hallo @juks,

I got problem with bitmap[1]. Our host bank use smartVista. Message type and the field packaged correctly, use hex format but our host bank only accept Bitmap[1] sent with hex format instead of text. I read overides config in parameters.js, but I can figure out which type should I use so Bitmap converted to hex.
Thank you so much.

ASCII format message exchange

Hi,

I wanted to understand if it's possible to have ASCII message format instead of binary with this ISO gateway? Couldn't find it in the documents. If ASCII format is not supported out of the box could you advise how should I got about modifying/adjusting the source to achieve it.

PIN Block field 52

Hi Igor,
HOpe you're doing.
I get one question
Is SQ support pin block (de52) encrypt and decrypt.
If yes what is the method? How to form the pin block tosend to host

Question About Header

Hello!
What is the correct form to use the static header? I want to implement something that needs to set up a header for each type of message, ej: 0200: ISO002600005, 0800: ISO002600015....

Thank you! You've done an excelent work! Congratulations!!

Hexadecimal data encoding

Hi! This is not a bug but a doubt I have. The server I'm connecting to expects to receive the ISO data in hexadecimal encoding.

Do you have plans to support this?

Thanks

Unknown packager

Hello,
I cloned a fresh copy and tested with your curl example but only get this error.

Anyone experienced this or have a clue why it behaves this way?

[ec2-user@ SocketQueue]$ node socketQueue.js --upstreamHost=localhost --upstreamPort=5555 --listenPort=2014 --vv --echoServerPort=5555 --testRealLife
2019-04-28 21:23:08 - info: Important: starting...                         
2019-04-28 21:23:08 - info: Remote host configuration name: smartVista                         
2019-04-28 21:23:08 - info: Connecting to upstream server localhost:5555                         
2019-04-28 21:23:08 - info: Relay raw ISO-8583 server is now running on port 2014                         
2019-04-28 21:23:08 - info: Echo server is now running on port 5555
                         
2019-04-28 21:23:08 - info: Connected to upstream 127.0.0.1:5555!                         
2019-04-28 21:23:08 - info: Processing queue [pending 0 / total 0]                         
2019-04-28 21:23:08 - info: The queue is empty                         
2019-04-28 21:23:12 - info: Client ::ffff:61657 connected                         
2019-04-28 21:23:12 - info: Client ::ffff:61657 sent data (830b)                         
2019-04-28 21:23:12 - verbose: [POST...H...]                         
Error unpacking data from bit 16
Packager: undefined: Unknown packager 16 Error: Unknown packager 16
    at _unpack (/home/ec2-user/SocketQueue/lib/iso8583/lib/iso8583.js:24:28)
    at unpack (/home/ec2-user/SocketQueue/lib/iso8583/lib/iso8583.js:86:23)
    at new Iso8583Packet (/home/ec2-user/SocketQueue/lib/iso8583-packet/lib/iso8583Packet.js:47:37)
    at queue.addMessage (/home/ec2-user/SocketQueue/lib/iso8583-queue/lib/iso8583Queue.js:50:11)
    at Upstream.sendData (/home/ec2-user/SocketQueue/lib/socketServer/lib/upstream.js:77:24)
    at Socket.<anonymous> (/home/ec2-user/SocketQueue/lib/socketServer/lib/clientSocket.js:47:21)
    at emitOne (events.js:77:13)
    at Socket.emit (events.js:169:7)
    at readableAddChunk (_stream_readable.js:153:18)
    at Socket.Readable.push (_stream_readable.js:111:10)
Error unpacking data from bit 19
Packager: undefined: Unknown packager 19 Error: Unknown packager 19
    at _unpack (/home/ec2-user/SocketQueue/lib/iso8583/lib/iso8583.js:24:28)
    at unpack (/home/ec2-user/SocketQueue/lib/iso8583/lib/iso8583.js:86:23)
    at new Iso8583Packet (/home/ec2-user/SocketQueue/lib/iso8583-packet/lib/iso8583Packet.js:47:37)
    at queue.addMessage (/home/ec2-user/SocketQueue/lib/iso8583-queue/lib/iso8583Queue.js:50:11)
    at Upstream.sendData (/home/ec2-user/SocketQueue/lib/socketServer/lib/upstream.js:77:24)
    at Socket.<anonymous> (/home/ec2-user/SocketQueue/lib/socketServer/lib/clientSocket.js:47:21)
    at emitOne (events.js:77:13)
    at Socket.emit (events.js:169:7)
    at readableAddChunk (_stream_readable.js:153:18)
    at Socket.Readable.push (_stream_readable.js:111:10)
Error unpacking data from bit 26
Packager: undefined: Unknown packager 26 Error: Unknown packager 26
    at _unpack (/home/ec2-user/SocketQueue/lib/iso8583/lib/iso8583.js:24:28)
    at unpack (/home/ec2-user/SocketQueue/lib/iso8583/lib/iso8583.js:86:23)
    at new Iso8583Packet (/home/ec2-user/SocketQueue/lib/iso8583-packet/lib/iso8583Packet.js:47:37)
    at queue.addMessage (/home/ec2-user/SocketQueue/lib/iso8583-queue/lib/iso8583Queue.js:50:11)
    at Upstream.sendData (/home/ec2-user/SocketQueue/lib/socketServer/lib/upstream.js:77:24)
    at Socket.<anonymous> (/home/ec2-user/SocketQueue/lib/socketServer/lib/clientSocket.js:47:21)
    at emitOne (events.js:77:13)
    at Socket.emit (events.js:169:7)
    at readableAddChunk (_stream_readable.js:153:18)
    at Socket.Readable.push (_stream_readable.js:111:10)
Error unpacking data from bit 29
Packager: undefined: Unknown packager 29 Error: Unknown packager 29
    at _unpack (/home/ec2-user/SocketQueue/lib/iso8583/lib/iso8583.js:24:28)
    at unpack (/home/ec2-user/SocketQueue/lib/iso8583/lib/iso8583.js:86:23)
    at new Iso8583Packet (/home/ec2-user/SocketQueue/lib/iso8583-packet/lib/iso8583Packet.js:47:37)
    at queue.addMessage (/home/ec2-user/SocketQueue/lib/iso8583-queue/lib/iso8583Queue.js:50:11)
    at Upstream.sendData (/home/ec2-user/SocketQueue/lib/socketServer/lib/upstream.js:77:24)
    at Socket.<anonymous> (/home/ec2-user/SocketQueue/lib/socketServer/lib/clientSocket.js:47:21)
    at emitOne (events.js:77:13)
    at Socket.emit (events.js:169:7)
    at readableAddChunk (_stream_readable.js:153:18)
    at Socket.Readable.push (_stream_readable.js:111:10)
Error unpacking data from bit 34
Packager: undefined: Unknown packager 34 Error: Unknown packager 34
    at _unpack (/home/ec2-user/SocketQueue/lib/iso8583/lib/iso8583.js:24:28)
    at unpack (/home/ec2-user/SocketQueue/lib/iso8583/lib/iso8583.js:86:23)
    at new Iso8583Packet (/home/ec2-user/SocketQueue/lib/iso8583-packet/lib/iso8583Packet.js:47:37)
    at queue.addMessage (/home/ec2-user/SocketQueue/lib/iso8583-queue/lib/iso8583Queue.js:50:11)
    at Upstream.sendData (/home/ec2-user/SocketQueue/lib/socketServer/lib/upstream.js:77:24)
    at Socket.<anonymous> (/home/ec2-user/SocketQueue/lib/socketServer/lib/clientSocket.js:47:21)
    at emitOne (events.js:77:13)
    at Socket.emit (events.js:169:7)
    at readableAddChunk (_stream_readable.js:153:18)
    at Socket.Readable.push (_stream_readable.js:111:10)
Error unpacking data from bit 36
Packager: undefined: Unknown packager 36 Error: Unknown packager 36
    at _unpack (/home/ec2-user/SocketQueue/lib/iso8583/lib/iso8583.js:24:28)
    at unpack (/home/ec2-user/SocketQueue/lib/iso8583/lib/iso8583.js:86:23)
    at new Iso8583Packet (/home/ec2-user/SocketQueue/lib/iso8583-packet/lib/iso8583Packet.js:47:37)
    at queue.addMessage (/home/ec2-user/SocketQueue/lib/iso8583-queue/lib/iso8583Queue.js:50:11)
    at Upstream.sendData (/home/ec2-user/SocketQueue/lib/socketServer/lib/upstream.js:77:24)
    at Socket.<anonymous> (/home/ec2-user/SocketQueue/lib/socketServer/lib/clientSocket.js:47:21)
    at emitOne (events.js:77:13)
    at Socket.emit (events.js:169:7)
    at readableAddChunk (_stream_readable.js:153:18)
    at Socket.Readable.push (_stream_readable.js:111:10)
Error unpacking data from bit 44
Packager: undefined: Unknown packager 44 Error: Unknown packager 44
    at _unpack (/home/ec2-user/SocketQueue/lib/iso8583/lib/iso8583.js:24:28)
    at unpack (/home/ec2-user/SocketQueue/lib/iso8583/lib/iso8583.js:86:23)
    at new Iso8583Packet (/home/ec2-user/SocketQueue/lib/iso8583-packet/lib/iso8583Packet.js:47:37)
    at queue.addMessage (/home/ec2-user/SocketQueue/lib/iso8583-queue/lib/iso8583Queue.js:50:11)
    at Upstream.sendData (/home/ec2-user/SocketQueue/lib/socketServer/lib/upstream.js:77:24)
    at Socket.<anonymous> (/home/ec2-user/SocketQueue/lib/socketServer/lib/clientSocket.js:47:21)
    at emitOne (events.js:77:13)
    at Socket.emit (events.js:169:7)
    at readableAddChunk (_stream_readable.js:153:18)
    at Socket.Readable.push (_stream_readable.js:111:10)
Error unpacking data from bit 50
Packager: undefined: Unknown packager 50 Error: Unknown packager 50
    at _unpack (/home/ec2-user/SocketQueue/lib/iso8583/lib/iso8583.js:24:28)
    at unpack (/home/ec2-user/SocketQueue/lib/iso8583/lib/iso8583.js:86:23)
    at new Iso8583Packet (/home/ec2-user/SocketQueue/lib/iso8583-packet/lib/iso8583Packet.js:47:37)
    at queue.addMessage (/home/ec2-user/SocketQueue/lib/iso8583-queue/lib/iso8583Queue.js:50:11)
    at Upstream.sendData (/home/ec2-user/SocketQueue/lib/socketServer/lib/upstream.js:77:24)
    at Socket.<anonymous> (/home/ec2-user/SocketQueue/lib/socketServer/lib/clientSocket.js:47:21)
    at emitOne (events.js:77:13)
    at Socket.emit (events.js:169:7)
    at readableAddChunk (_stream_readable.js:153:18)
    at Socket.Readable.push (_stream_readable.js:111:10)
Error unpacking data from bit 59
Packager: undefined: Unknown packager 59 Error: Unknown packager 59
    at _unpack (/home/ec2-user/SocketQueue/lib/iso8583/lib/iso8583.js:24:28)
    at unpack (/home/ec2-user/SocketQueue/lib/iso8583/lib/iso8583.js:86:23)
    at new Iso8583Packet (/home/ec2-user/SocketQueue/lib/iso8583-packet/lib/iso8583Packet.js:47:37)
    at queue.addMessage (/home/ec2-user/SocketQueue/lib/iso8583-queue/lib/iso8583Queue.js:50:11)
    at Upstream.sendData (/home/ec2-user/SocketQueue/lib/socketServer/lib/upstream.js:77:24)
    at Socket.<anonymous> (/home/ec2-user/SocketQueue/lib/socketServer/lib/clientSocket.js:47:21)
    at emitOne (events.js:77:13)
    at Socket.emit (events.js:169:7)
    at readableAddChunk (_stream_readable.js:153:18)
    at Socket.Readable.push (_stream_readable.js:111:10)
Error unpacking data from bit 61
Packager: undefined: Unknown packager 61 Error: Unknown packager 61
    at _unpack (/home/ec2-user/SocketQueue/lib/iso8583/lib/iso8583.js:24:28)
    at unpack (/home/ec2-user/SocketQueue/lib/iso8583/lib/iso8583.js:86:23)
    at new Iso8583Packet (/home/ec2-user/SocketQueue/lib/iso8583-packet/lib/iso8583Packet.js:47:37)
    at queue.addMessage (/home/ec2-user/SocketQueue/lib/iso8583-queue/lib/iso8583Queue.js:50:11)
    at Upstream.sendData (/home/ec2-user/SocketQueue/lib/socketServer/lib/upstream.js:77:24)
    at Socket.<anonymous> (/home/ec2-user/SocketQueue/lib/socketServer/lib/clientSocket.js:47:21)
    at emitOne (events.js:77:13)
    at Socket.emit (events.js:169:7)
    at readableAddChunk (_stream_readable.js:153:18)
    at Socket.Readable.push (_stream_readable.js:111:10)
Error unpacking data from bit 63
Packager: undefined: Unknown packager 63 Error: Unknown packager 63
    at _unpack (/home/ec2-user/SocketQueue/lib/iso8583/lib/iso8583.js:24:28)
    at unpack (/home/ec2-user/SocketQueue/lib/iso8583/lib/iso8583.js:86:23)
    at new Iso8583Packet (/home/ec2-user/SocketQueue/lib/iso8583-packet/lib/iso8583Packet.js:47:37)
    at queue.addMessage (/home/ec2-user/SocketQueue/lib/iso8583-queue/lib/iso8583Queue.js:50:11)
    at Upstream.sendData (/home/ec2-user/SocketQueue/lib/socketServer/lib/upstream.js:77:24)
    at Socket.<anonymous> (/home/ec2-user/SocketQueue/lib/socketServer/lib/clientSocket.js:47:21)
    at emitOne (events.js:77:13)
    at Socket.emit (events.js:169:7)
    at readableAddChunk (_stream_readable.js:153:18)
    at Socket.Readable.push (_stream_readable.js:111:10)
2019-04-28 21:23:12 - info: ::ffff:61657: Warning! Failed to parse iso8583 packet. Won't queue!                         
2019-04-28 21:23:12 - info: Client ::ffff:61657 <end> event                         
2019-04-28 21:23:12 - info: Client ::ffff:61657 <close> event 

Add a dynamic header in packager

Hi I am trying to configure a new header in order to connect with POWERCARD from HPS.
The ISO8583 format is the following :
[ Protocol identification] + [ PowerCARD header ] + [Type of message] + [Bit maps] + [Data fields]
so header look like this : [ Protocol identification] + [ PowerCARD header ] where
[ Protocol identification] = "ISO"
[ PowerCARD header ] =
Position Content
 1-4 Number of characters in the message.
 5 Product code associated with the message. Valid value: ‘2’ = POS
 6-10 The version of the POS software.
 11-13 In case of rejection of message for wrong format, this field must contain the number of the first erroneous element, otherwise it contains "000" If the TPE has messages waiting to be sent to the server, this field must contain "*".

a sample of header will be ISO0413211111000 where [ISO ] + [ 0413 + 2 + 11111 + 000 ]

please can you assist on the way to configure this so the POS sent the message to be routed on the upstream

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.