From c312550429cd3eaddadf1fdacf9f1225d4a56a75 Mon Sep 17 00:00:00 2001 From: Christopher Jeffrey Date: Wed, 27 Apr 2016 14:45:11 -0700 Subject: [PATCH] add uri parsing. --- lib/bcoin/uri.js | 61 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 lib/bcoin/uri.js diff --git a/lib/bcoin/uri.js b/lib/bcoin/uri.js new file mode 100644 index 00000000..c9a124ce --- /dev/null +++ b/lib/bcoin/uri.js @@ -0,0 +1,61 @@ +/*! + * uri.js - uri parsing for bcoin + * Copyright (c) 2014-2015, Fedor Indutny (MIT License) + * Copyright (c) 2014-2016, Christopher Jeffrey (MIT License). + * https://github.com/indutny/bcoin + */ + +var url = require('url'); +var querystring = require('querystring'); + +exports.parse = function parse(uri) { + var data = url.parse(uri); + var query = querystring.parse(data.query || ''); + + assert(data.protocol === 'bitcoin:', 'Not a bitcoin URI.'); + assert(data.hostname, 'No address present.'); + + return { + address: data.hostname, + amount: query.amount ? utils.satoshi(query.amount) : null, + label: query.label || null, + message: query.message || null, + request: query.r || null + }; +}; + +exports.validate = function validate(uri) { + try { + exports.parse(uri); + return true; + } catch (e) { + return false; + } +}; + +exports.stringify = function stringify(address, amount) { + var query = {}; + var data = address; + var uri; + + if (typeof address === 'string') + data = { address: address, amount: amount }; + + assert(data.address, 'Address is required for a bitcoin URI.'); + + uri = 'bitcoin:' + data.address; + + if (data.amount) + query.amount = utils.btc(data.amount); + + if (data.label) + query.label = data.label; + + if (data.message) + query.message = data.message; + + if (data.request) + query.r = data.request; + + return uri + querystring.stringify(query); +};