#!/usr/bin/node // // ledger?l=L // transaction?h=H // ledger_entry?l=L&h=H // account?l=L&a=A // directory?l=L&dir_root=H&i=I // directory?l=L&o=A&i=I // owner directory // offer?l=L&offer=H // offer?l=L&account=A&i=I // ripple_state=l=L&a=A&b=A&c=C // account_lines?l=L&a=A // // A=address // C=currency 3 letter code // H=hash // I=index // L=current | closed | validated | index | hash // var extend = require("extend"); var http = require("http"); var url = require("url"); var Remote = require("../src/js/remote.js").Remote; var program = process.argv[1]; var httpd_response = function (res, opts) { var self=this; res.statusCode = opts.statusCode; res.end( "" + "Title" + "" + "State:" + self.state + "" + (opts.body || '') + '
'
      + (opts.url || '')
      + '
' + "" + "" ); }; var html_link = function (generic) { return '' + generic + ''; }; // Build a link to a type. var build_uri = function (params, opts) { var c; if (params.type === 'account') { c = { pathname: 'account', query: { l: params.ledger, a: params.account, }, }; } else if (params.type === 'ledger') { c = { pathname: 'ledger', query: { l: params.ledger, }, }; } else if (params.type === 'transaction') { c = { pathname: 'transaction', query: { h: params.hash, }, }; } else { c = {}; } opts = opts || {}; c.protocol = "http"; c.hostname = opts.hostname || self.base.hostname; c.port = opts.port || self.base.port; return url.format(c); }; var build_link = function (item, link) { console.log(link); return "" + item + ""; }; var rewrite_type = function (type, obj, opts) { if ('amount' === type) { if ('string' === typeof obj) { // XRP. return '' + obj + ''; } else { obj.issuer = rewrite_type('address', obj.issuer, opts); return obj; } return build_link( obj, build_uri({ type: 'account', account: obj }, opts) ); } if ('address' === type) { return build_link( obj, build_uri({ type: 'account', account: obj }, opts) ); } else if ('ledger' === type) { return build_link( obj, build_uri({ type: 'ledger', ledger: obj, }, opts) ); } else if ('transaction' === type) { return build_link( obj, build_uri({ type: 'transaction', hash: obj }, opts) ); } return 'ERROR: ' + type; }; var rewrite_object = function (obj, opts) { var out = extend({}, obj); if ('TransactionType' in obj) { // It's a transaction. out.TransactionType = '' + obj.TransactionType + ''; if ('TakerGets' in obj) out.TakerGets = rewrite_type('amount', obj.TakerGets, opts); if ('TakerPays' in obj) out.TakerPays = rewrite_type('amount', obj.TakerPays, opts); } if ('Account' in obj) { out.Account = rewrite_type('address', obj.Account, opts); } if ('parent_hash' in obj) { out.parent_hash = rewrite_type('ledger', out.parent_hash, opts); } if ('ledger_index' in obj) { out.ledger_index = rewrite_type('ledger', out.ledger_index, opts); } if ('ledger_current_index' in obj) { out.ledger_current_index = rewrite_type('ledger', out.ledger_current_index, opts); } if ('ledger_hash' in obj) { out.ledger_hash = rewrite_type('ledger', out.ledger_hash, opts); } if ('ledger' in obj) { // It's a ledger header. out.ledger = rewrite_object(out.ledger, opts); if ('ledger_hash' in out.ledger) out.ledger.ledger_hash = '' + out.ledger.ledger_hash + ''; delete out.ledger.hash; delete out.ledger.totalCoins; } if ('node' in obj && 'LedgerEntryType' in obj.node) { // Its a ledger entry. if (obj.node.LedgerEntryType === 'AccountRoot') { out.node.Account = rewrite_type('address', obj.node.Account, opts); // out.node.hash = rewrite_type('transaction', obj.node.hash, opts); out.node.PreviousTxnID = out.node.PreviousTxnID = rewrite_type('transaction', obj.node.PreviousTxnID, opts); out.node.PreviousTxnLgrSeq = rewrite_type('ledger', out.node.PreviousTxnLgrSeq, opts); } out.node.LedgerEntryType = '' + out.node.LedgerEntryType + ''; } return out; }; if (process.argv.length < 4 || process.argv.length > 7) { console.log("Usage: %s ws_ip ws_port [ [ []]]", program); } else { var ws_ip = process.argv[2]; var ws_port = process.argv[3]; var ip = process.argv.length > 4 ? process.argv[4] : "127.0.0.1"; var port = process.argv.length > 5 ? process.argv[5] : "8080"; console.log("START"); var self = this; self.base = { hostname: ip, port: port, }; var remote = (new Remote({ websocket_ip: ws_ip, websocket_port: ws_port, trace: true })) .on('state', function (m) { console.log("STATE: %s", m); self.state = m; }) // .once('ledger_closed', callback) .connect() ; console.log("SERVE"); var server = http.createServer(function (req, res) { var input = ""; req.setEncoding(); req.on('data', function (buffer) { // console.log("DATA: %s", buffer); input = input + buffer; }); req.on('end', function () { console.log("URL: %s", req.url); // console.log("HEADERS: %s", JSON.stringify(req.headers, undefined, 2)); var _parsed = url.parse(req.url, true); var _url = JSON.stringify(_parsed, undefined, 2); console.log("HEADERS: %s", JSON.stringify(_parsed, undefined, 2)); if (_parsed.pathname === "/account") { var request = remote .request_ledger_entry('account_root') .ledger_index(-1) .account_root(_parsed.query.a) .on('success', function (m) { console.log("account_root: %s", JSON.stringify(m, undefined, 2)); httpd_response(res, { statusCode: 200, url: _url, body: "
"
                            + JSON.stringify(rewrite_object(m, self.base), undefined, 2)
                            + "
" }); }) .request(); } else if (_parsed.pathname === "/ledger") { var request = remote .request_ledger_header() .on('success', function (m) { console.log("Ledger: %s", JSON.stringify(m, undefined, 2)); httpd_response(res, { statusCode: 200, url: _url, body: "
"
                          + JSON.stringify(rewrite_object(m, self.base), undefined, 2)
                          +"
" }); }) if (_parsed.query.l && _parsed.query.l.length === 64) { request.ledger_hash(_parsed.query.l); } else if (_parsed.query.l) { request.ledger_index(_parsed.query.l); } else { request.ledger_index(-1); } request.request(); } else if (_parsed.pathname === "/transaction") { var request = remote .request_tx(_parsed.query.h) // .request_transaction_entry(_parsed.query.h) // .ledger_select(_parsed.query.l) .on('success', function (m) { console.log("transaction: %s", JSON.stringify(m, undefined, 2)); httpd_response(res, { statusCode: 200, url: _url, body: "
"
                            + JSON.stringify(rewrite_object(m, self.base), undefined, 2)
                            +"
" }); }) .on('error', function (m) { httpd_response(res, { statusCode: 200, url: _url, body: "
"
                            + 'ERROR: ' + JSON.stringify(m, undefined, 2)
                            +"
" }); }) .request(); } else { var test = build_uri({ type: 'account', ledger: 'closed', account: 'rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh', }, self.base); httpd_response(res, { statusCode: req.url === "/" ? 200 : 404, url: _url, }); } }); }); server.listen(port, ip, undefined, function () { console.log("Listening at: http://%s:%s", ip, port); }); } // vim:sw=2:sts=2:ts=8:et