You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
mymonero-core-js/monero_utils/monero_requestURI_utils.js

106 lines
3.8 KiB

// Copyright (c) 2014-2017, MyMonero.com
//
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification, are
// permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice, this list of
// conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
// of conditions and the following disclaimer in the documentation and/or other
// materials provided with the distribution.
//
// 3. Neither the name of the copyright holder nor the names of its contributors may be
// used to endorse or promote products derived from this software without specific
// prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
"use strict"
//
const monero_config = require('./monero_config')
//
function New_RequestFunds_URI(
args
)// -> String?
{
const address = args.address
if (!address) {
throw "missing address"
// return null
}
var uri = monero_config.coinUriPrefix + "//" + address // inserting a // so data detectors pick it up… maybe remove if/after not necessary
var isAppendingParam0 = true
function addParam(parameterName, value)
{
if (value == null || value == ""/*important*/ || typeof value === 'undefined') {
return
}
var conjunctionStr = "&"
if (isAppendingParam0 === true) {
isAppendingParam0 = false
conjunctionStr = "?"
}
uri += conjunctionStr
uri += parameterName + '=' + encodeURIComponent(value)
}
{
addParam('tx_amount', args.amount)
addParam('tx_amount_ccy', args.amountCcySymbol)
addParam('tx_description', args.description)
addParam('tx_payment_id', args.payment_id)
addParam('tx_message', args.message)
}
return uri
}
exports.New_RequestFunds_URI = New_RequestFunds_URI
//
function New_ParsedPayload_FromRequestURIString(uriString)
{ // throws; -> {}
// TODO
const url = new URL(uriString)
const protocol = url.protocol
if (protocol !== monero_config.coinUriPrefix) {
throw "Request URI has non-Monero protocol"
}
var target_address = url.pathname // var instead of const as have to finalize it
// it seems that if the URL has // in it, pathname will be empty, but host will contain the address instead
if (target_address === "" || typeof target_address === 'undefined' || !target_address) {
target_address = url.host || url.hostname
}
if (target_address.indexOf("//") == 0) {
target_address = target_address.slice(0 + "//".length, target_address.length) // strip prefixing "//" in case URL had protocol:// instead of protocol:
}
const searchParams = url.searchParams // needs to be parsed it seems
//
const payload =
{
address: target_address
}
const keyPrefixToTrim = "tx_"
const lengthOf_keyPrefixToTrim = keyPrefixToTrim.length
searchParams.forEach(
function(value, key)
{
var storeAt_key = key
if (key.indexOf(keyPrefixToTrim) === 0) {
storeAt_key = key.slice(lengthOf_keyPrefixToTrim, key.length)
}
payload["" + storeAt_key] = value
}
)
//
return payload
}
exports.New_ParsedPayload_FromRequestURIString = New_ParsedPayload_FromRequestURIString