Skip to content

Commit

Permalink
use continuous-local-storage instead of passing request (#5)
Browse files Browse the repository at this point in the history
  • Loading branch information
Oded Leiba authored Aug 17, 2016
1 parent 58a16be commit 726a017
Show file tree
Hide file tree
Showing 6 changed files with 57 additions and 49 deletions.
69 changes: 37 additions & 32 deletions coluutils.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ module.exports = (function () {
var assetIdencoder = require('cc-assetid-encoder')
var _ = require('lodash')
var rsa = require('node-rsa')
var session = require('continuation-local-storage').getNamespace(config.serverName)
var findBestMatchByNeededAssets = require('./modules/findBestMatchByNeededAssets')


Expand Down Expand Up @@ -198,14 +199,14 @@ var get_opreturn_data = function (asm) {
return deferred.promise;
}

coluutils.createIssueTransaction = function createIssueTransaction (metadata, headersToForward) {
coluutils.createIssueTransaction = function createIssueTransaction (metadata) {
var deferred = Q.defer();
metadata.divisibility = metadata.divisibility || 0
metadata.aggregationPolicy = metadata.aggregationPolicy || 'aggregatable'

tx = new bitcoinjs.Transaction();
// find inputs to cover the issuence
addInputsForIssueTransaction(tx, metadata, headersToForward).
addInputsForIssueTransaction(tx, metadata).
then(function(args){
var txResponse = encodeColorScheme(args);
deferred.resolve({txHex: txResponse.tx.toHex(), assetId: args.assetId || "0", metadata: metadata, multisigOutputs: txResponse.multisigOutputs, coloredOutputIndexes: txResponse.coloredOutputIndexes});
Expand All @@ -218,12 +219,12 @@ var get_opreturn_data = function (asm) {
return deferred.promise;
}

coluutils.createSendAssetTansaction = function createSendAssetTansaction(metadata, headersToForward) {
coluutils.createSendAssetTansaction = function createSendAssetTansaction (metadata) {
var deferred = Q.defer();

tx = new bitcoinjs.Transaction();
// find inputs to cover the issuence
addInputsForSendTransaction(tx, metadata, headersToForward).
addInputsForSendTransaction(tx, metadata).
then(validateFees).
then(function(data){
console.log(data.tx)
Expand Down Expand Up @@ -360,11 +361,11 @@ data.tx.outs.forEach( function (txOut) {
}


coluutils.getAssetMetadata = function getAssetMetadata(assetId, utxo, verbosity, headersToForward) {
coluutils.getAssetMetadata = function getAssetMetadata(assetId, utxo, verbosity) {
var self = this
var deferred = Q.defer()

getAssetInfo(assetId, utxo, verbosity, headersToForward).
getAssetInfo(assetId, utxo, verbosity).
then(function(data){
if(!data.issuanceTxid) {
if(utxo) {
Expand All @@ -379,8 +380,8 @@ data.tx.outs.forEach( function (txOut) {
{
var txid = utxo.split(':')[0]
var promises = []
promises.push(getTransaction(data.issuanceTxid, headersToForward))
if(data.issuanceTxid !== txid) promises.push(getTransaction(txid, headersToForward))
promises.push(getTransaction(data.issuanceTxid))
if(data.issuanceTxid !== txid) promises.push(getTransaction(txid))

console.log('requesting issue tx: ' + data.issuanceTxid)
console.log('requesting utxo tx: ' + txid)
Expand Down Expand Up @@ -624,12 +625,12 @@ data.tx.outs.forEach( function (txOut) {
}
}

function getUnspentArrayByAddressOrUtxo(address, utxo, headersToForward) {
function getUnspentArrayByAddressOrUtxo(address, utxo) {
var deferred = Q.defer();
try{
if(utxo) {
console.log('using specific utxo: ' + utxo)
getUtxo(Array.isArray(utxo) ? utxo : [utxo], headersToForward).
getUtxo(Array.isArray(utxo) ? utxo : [utxo]).
then(function (data) {
if(Array.isArray(data)) {
var reply = []
Expand All @@ -654,7 +655,7 @@ data.tx.outs.forEach( function (txOut) {
}
else {
console.log('using utxo for address: ' + address)
getUnspentsByAddress(Array.isArray(address) ? address : [address], headersToForward).
getUnspentsByAddress(Array.isArray(address) ? address : [address]).
then(function (data) {
var utxos = []
var jsondata = data
Expand All @@ -674,15 +675,15 @@ data.tx.outs.forEach( function (txOut) {
}


function getUtxo(utxo, headersToForward) {
function getUtxo(utxo) {

var deferred = Q.defer();
var args = {
//path: { "txid": txid, "index": index},
data: {
utxos: []
},
headers: _.assign({"Content-Type": "application/json"}, headersToForward)
headers: _.assign({"Content-Type": "application/json"}, getHeadersToForward())
}
try{

Expand Down Expand Up @@ -716,12 +717,12 @@ data.tx.outs.forEach( function (txOut) {

}

function getTransaction(txid, headersToForward) {
function getTransaction(txid) {

var deferred = Q.defer();
var args = {
path: { "txid": txid },
headers: _.assign({"Content-Type": "application/json"}, headersToForward)
headers: _.assign({"Content-Type": "application/json"}, getHeadersToForward())
}
try{

Expand Down Expand Up @@ -753,12 +754,12 @@ data.tx.outs.forEach( function (txOut) {



coluutils.broadcastTx = function broadcastTx(txhex, headersToForward) {
coluutils.broadcastTx = function broadcastTx(txhex) {

var deferred = Q.defer();
var args = {
data: { "txHex": txhex },
headers: _.assign({"Content-Type": "application/json"}, headersToForward)
headers: _.assign({"Content-Type": "application/json"}, getHeadersToForward())
}
try{

Expand Down Expand Up @@ -789,12 +790,12 @@ coluutils.broadcastTx = function broadcastTx(txhex, headersToForward) {
}


coluutils.requestParseTx = function requestParseTx(txid, headersToForward)
coluutils.requestParseTx = function requestParseTx(txid)
{
var deferred = Q.defer();
var args = {
data: { "txid": txid },
headers: _.assign({"Content-Type": "application/json"}, headersToForward)
headers: _.assign({"Content-Type": "application/json"}, getHeadersToForward())
}
try{

Expand Down Expand Up @@ -825,12 +826,12 @@ coluutils.requestParseTx = function requestParseTx(txid, headersToForward)



function getAssetInfo(assetId, utxo, verbosity, headersToForward)
function getAssetInfo(assetId, utxo, verbosity)
{
var deferred = Q.defer();
var args = {
path: { "assetId": assetId, "utxo": utxo, "verbosity": verbosity },
headers: _.assign({"Content-Type": "application/json"}, headersToForward)
headers: _.assign({"Content-Type": "application/json"}, getHeadersToForward())
}
try{

Expand Down Expand Up @@ -859,17 +860,16 @@ coluutils.requestParseTx = function requestParseTx(txid, headersToForward)
return deferred.promise;
}

function getUnspentsByAddress(addresses, headersToForward)
function getUnspentsByAddress(addresses)
{
var deferred = Q.defer();
addresses = _.uniq(addresses)
var args = {
data: {"addresses" : addresses },
headers: _.assign({"Content-Type": "application/json"}, headersToForward)
headers: _.assign({"Content-Type": "application/json"}, getHeadersToForward())
}
try{


client.methods.getaddressutxos(args, function (data, response) {
console.log(data.toString());
if (response.statusCode == 200) {
Expand Down Expand Up @@ -914,7 +914,7 @@ coluutils.requestParseTx = function requestParseTx(txid, headersToForward)
return fee
}

function addInputsForSendTransaction(tx, metadata, headersToForward) {
function addInputsForSendTransaction(tx, metadata) {
var deferred = Q.defer()
var satoshiCost = comupteCost(true, metadata)
var totalInputs = { amount: 0 }
Expand All @@ -925,7 +925,7 @@ coluutils.requestParseTx = function requestParseTx(txid, headersToForward)

try{
if(metadata.from || metadata.sendutxo) {
getUnspentArrayByAddressOrUtxo(metadata.from, metadata.sendutxo, headersToForward)
getUnspentArrayByAddressOrUtxo(metadata.from, metadata.sendutxo)
.then(function(utxos){
if(metadata.from)
console.log('got unspents for address: ' + metadata.from + " from block explorer")
Expand Down Expand Up @@ -1142,7 +1142,7 @@ coluutils.requestParseTx = function requestParseTx(txid, headersToForward)
return true
}

function addInputsForIssueTransaction(tx, metadata, headersToForward) {
function addInputsForIssueTransaction(tx, metadata) {
var deferred = Q.defer()
var totalInputs = { amount: 0 }
//var metadata = safeParse(metadata)
Expand Down Expand Up @@ -1178,7 +1178,7 @@ coluutils.requestParseTx = function requestParseTx(txid, headersToForward)
// tempararly work with bitcoind though
// check there is no op_return in tx for the utxo we are about to use
// TODO: need to check if we can decode it and its ours
getUnspentsByAddress([metadata.issueAddress], headersToForward)
getUnspentsByAddress([metadata.issueAddress])
.then(function (data) {
var jsonresponse = data
var utxos = []
Expand Down Expand Up @@ -1397,13 +1397,13 @@ coluutils.requestParseTx = function requestParseTx(txid, headersToForward)
return deferred.promise
}

coluutils.getAssetStakeholders = function getAssetStakeholders(assetid, minconfnum, headersToForward) {
coluutils.getAssetStakeholders = function getAssetStakeholders(assetid, minconfnum) {
console.log('getAssetStakeholders: ' + assetid)
minconfnum = minconfnum || 0
var deferred = Q.defer();
var args = {
path: { "assetid": assetid, "minconf": minconfnum },
headers: _.assign({"Content-Type": "application/json"}, headersToForward)
headers: _.assign({"Content-Type": "application/json"}, getHeadersToForward())
}
try{
client.methods.getassetholders(args, function (data, response) {
Expand Down Expand Up @@ -1431,8 +1431,8 @@ coluutils.requestParseTx = function requestParseTx(txid, headersToForward)
}


coluutils.getAddressInfo = function getAddressInfo(address, headersToForward) {
return getUnspentsByAddress(Array.isArray(address) ? address : [address], headersToForward)
coluutils.getAddressInfo = function getAddressInfo(address) {
return getUnspentsByAddress(Array.isArray(address) ? address : [address])
}

function getNextOutputValue(metadata) {
Expand Down Expand Up @@ -1514,6 +1514,11 @@ coluutils.requestParseTx = function requestParseTx(txid, headersToForward)
return btc.mul(100000000);
}

function getHeadersToForward() {
var context = session.get('context')
return context && context.req && context.req.service && context.req.service.headersToForward
}

coluutils();

return coluutils;
Expand Down
2 changes: 2 additions & 0 deletions config.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
var config = {
env: 'development',
testnet: true,
serverName: 'coloredcoinsd',
google_api_key: 'AIzaSyBJfxobLSO_IM9tI1ATWpOelVInNuH1kBM',
machineurl: 'http://api.coloredcoins.org',
useS3: true,
Expand Down Expand Up @@ -57,6 +58,7 @@ if (module_exists('./config-local')) {
config.bitcoind.path = process.env.BITCOIND_PATH || config.bitcoind.path
config.torrentServer.url = process.env.TORRENT_SERVER_URL || config.torrentServer.url
config.testnet = process.env.TESTNET || config.testnet
config.serverName = process.env.SERVERNAME || config.serverName
config.torrentServer.token = process.env.TORRENT_SERVER_TOKEN || config.torrentServer.token
config.minfee = parseInt(process.env.MINFEE || '' + config.minfee, 10)
config.mindustvalue = parseInt(process.env.MINDUSTVALUE || '' + config.mindustvalue, 10)
Expand Down
20 changes: 7 additions & 13 deletions controllers/v2/color.js
Original file line number Diff line number Diff line change
Expand Up @@ -113,9 +113,8 @@ module.exports = (function () {
},
'action': function (req, res, next) {
var verbosity = parseInt(req.query.verbosity)
var headersToForward = req.service && req.service.headersToForward
verbosity = ([0,1].indexOf(verbosity) > -1)? verbosity : 1
api.getAssetMetadata(req.params.assetId, req.params.utxo, verbosity, headersToForward).
api.getAssetMetadata(req.params.assetId, req.params.utxo, verbosity).
then(
function(data) { res.status(200).send(data) },
next
Expand All @@ -142,7 +141,7 @@ module.exports = (function () {
"nickname": "getAddressInfo"
},
'action': function (req, res, next) {
api.getAddressInfo(req.params.address, req.service && req.service.headersToForward).
api.getAddressInfo(req.params.address).
then(function (data) {
var jsondata = api.safeParse(data)
res.status(200).send(Array.isArray(req.params.address) ? jsondata : jsondata[0])
Expand Down Expand Up @@ -184,11 +183,10 @@ module.exports = (function () {

function tryBroadcastAsset(req, res, next) {
console.log("tryBroadcastAsset")
var headersToForward = req.service && req.service.headersToForward

api.broadcastTx(req.body.txHex, headersToForward).
api.broadcastTx(req.body.txHex).
then(function(txid){
api.requestParseTx(txid, headersToForward);
api.requestParseTx(txid);
res.status(200).send({txid: txid});
}).
catch(next).done();
Expand All @@ -202,9 +200,7 @@ module.exports = (function () {
validateInput(req.body).
then(checkParameters).
then(api.uploadMetadata).
then(function (metadata) {
return api.createIssueTransaction(metadata, req.service && req.service.headersToForward)
}).
then(api.createIssueTransaction).
then(function(data) {
api.seedMetadata(data.metadata.sha1)
var response = {txHex: data.txHex, assetId: data.assetId, coloredOutputIndexes: data.coloredOutputIndexes }
Expand Down Expand Up @@ -288,9 +284,7 @@ module.exports = (function () {
validateInput(req.body, null, ['from', 'sendutxo']).
then(checkParameters).
then(api.uploadMetadata).
then(function (data) {
return api.createSendAssetTansaction(data, req.service && req.service.headersToForward)
}).
then(api.createSendAssetTansaction).
then(function(data) {
api.seedMetadata(data.metadata.sha1);
res.json({ txHex: data.tx.toHex(), metadataSha1: data.metadata.sha1, multisigOutputs: data.multisigOutputs });
Expand All @@ -304,7 +298,7 @@ module.exports = (function () {

function trygetAssetStakeholders(req, res, next) {
try{
api.getAssetStakeholders(req.params.assetId, req.params.numConfirmations, req.service.headersToForward)
api.getAssetStakeholders(req.params.assetId, req.params.numConfirmations)
.then(function(data) {
res.json(data);
})
Expand Down
4 changes: 1 addition & 3 deletions controllers/v3/color.js
Original file line number Diff line number Diff line change
Expand Up @@ -163,9 +163,7 @@ module.exports = (function () {
validateInput(req.body, null, ['from', 'sendutxo']).
then(checkParameters).
then(api.uploadMetadata).
then(function (data) {
return api.createSendAssetTansaction(data, req.service && req.service.headersToForward)
}).
then(api.createSendAssetTansaction).
then(function(data){
api.seedMetadata(data.metadata.sha1)
res.json({ txHex: data.tx.toHex(), metadataSha1: data.metadata.sha1, multisigOutputs: data.multisigOutputs, coloredOutputIndexes: data.coloredOutputIndexes });
Expand Down
2 changes: 2 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@
"cc-errors": "~0.0.7",
"cc-request-id": "~0.0.3",
"cc-transaction": "^1.1.0",
"cls-middleware": "^1.1.0",
"continuation-local-storage": "^3.1.7",
"cors": "^2.7.1",
"express": "4.10.4",
"le_node": "^0.2.1",
Expand Down
9 changes: 8 additions & 1 deletion server.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ var piwik = require('./piwik')
var morgan = require('morgan')
var requestId = require('cc-request-id')
var errors = require('cc-errors')
var session = require('continuation-local-storage').createNamespace(config.serverName)
var clsify = require('cls-middleware')

var fs = require('fs')
var log4js = require('log4js')
Expand Down Expand Up @@ -109,8 +111,13 @@ app.use(function (req, res, next) {
next()
})

app.use(clsify(session))
app.use(function (req, res, next) {
session.set('context', {req: req, res: res})
next()
})
if (config.secret) {
app.use(requestId({secret: config.secret, namespace: 'coloredcoinsd'}))
app.use(requestId({secret: config.secret, namespace: config.serverName}))
}

if (config.piwik.enabled) {
Expand Down

0 comments on commit 726a017

Please sign in to comment.