node.cryptopia
Version:
Node Cryptopia API - asynchronous node.js library for the Cryptopia API
205 lines (183 loc) • 7.76 kB
JavaScript
/* ============================================================
* node.bittrex.api
* https://github.com/n0mad01/node.bittrex.api
*
* ============================================================
* Copyright 2014-2015, Adrian Soluch - http://soluch.us/
* Released under the MIT License
* ============================================================ */
var NodeCryptopia = function() {
'use strict';
var request = require('request'),
rp = require('request-promise'),
crypto = require('crypto'),
JSONStream = require('JSONStream'),
es = require('event-stream');
var start,
public_request_options = {
method: 'GET',
agent: false,
headers: {
"User-Agent": "Mozilla/4.0 (compatible; SIGBOT Cryptopia API)",
"Content-type": "application/x-www-form-urlencoded"
}
},
private_request_options = {
method: 'POST',
json: true,
headers: {
"User-Agent": "Mozilla/4.0 (compatible; SIGBOT Cryptopia API)",
"Content-Type":"application/json; charset=utf-8",
}
};
var opts = {
baseUrl: 'https://www.cryptopia.co.nz/api/',
apikey: 'APIKEY',
apisecret: 'APISECRET',
verbose: false,
cleartext: false,
stream: false
};
var getNonce = function() {
return Math.floor(new Date().getTime() / 1000);
};
var extractOptions = function(options) {
var o = Object.keys(options),
i;
for (i = 0; i < o.length; i++) {
opts[o[i]] = options[o[i]];
}
};
var setRequestUri = function(command, options) {
var op = private_request_options;
op.uri = opts.baseUrl + command;
const nonce = getNonce();
const HASHED_POST_PARAMS = crypto.createHash('md5').update(JSON.stringify(options)).digest('base64');
const requestSignature = opts.apikey + 'POST' + encodeURIComponent(op.uri).toLowerCase() + nonce + HASHED_POST_PARAMS;
const hmacSignature = crypto.createHmac('sha256', Buffer.from(opts.apisecret, 'base64')).update(requestSignature).digest('base64');
const authorization = 'amx ' + opts.apikey + ':' + hmacSignature + ':' + nonce;
//op.body = options;
op.verbose = opts.verbose;
op.body = options;
op.headers['Authorization'] = authorization;
op.headers['Content-Length'] = Buffer.byteLength(JSON.stringify(options));
return op;
};
var sendRequestCallback = function(callback, op) {
start = Date.now();
switch (opts.stream) {
case true:
request(op)
.pipe(JSONStream.parse())
.pipe(es.mapSync(function(data) {
callback(data);
((opts.verbose) ? console.log("streamed from " + op.uri + " in: %ds", (Date.now() - start) / 1000) : '');
}));
break;
case false:
request(op, function(error, result, body) {
((opts.verbose) ? console.log("requested from " + result.request.href + " in: %ds", (Date.now() - start) / 1000) : '');
if (!body || !result || result.statusCode != 200) {
console.error(error);
} else {
callback(((opts.cleartext) ? body : JSON.parse(body)));
}
});
break;
}
};
var sendRequestCallbackPrivate = function(callback, op) {
start = Date.now();
rp(op).then(function (body){
((opts.verbose) ? console.log("requested from " + op.uri + " in: %ds", (Date.now() - start) / 1000) : '');
callback(body);
})
.catch(function (err){
((opts.verbose) ? console.log("requested from " + op.uri + " in: %ds", (Date.now() - start) / 1000) : '')
console.error(err);
});
};
return {
options: function(options) {
extractOptions(options);
},
//Public API
getmarkets: function(callback) {
var op = public_request_options;
op.uri = opts.baseUrl + 'GetMarkets';
sendRequestCallback(callback, op);
},
getcurrencies: function(callback) {
var op = public_request_options;
op.uri = opts.baseUrl + 'GetCurrencies';
sendRequestCallback(callback, op);
},
gettradepairs: function(callback) {
var op = public_request_options;
op.uri = opts.baseUrl + 'GetTradePairs';
sendRequestCallback(callback, op);
},
getmarket: function(options, callback) {
var op = public_request_options;
op.uri = opts.baseUrl + 'GetMarket/' + options;
sendRequestCallback(callback, op);
},
getmarkethistory: function(options, callback) {
var op = public_request_options;
op.uri = opts.baseUrl + 'GetMarketHistory/' + options;
sendRequestCallback(callback, op);
},
getmarketorders: function(options, callback) {
var op = public_request_options;
op.uri = opts.baseUrl + 'GetMarketOrders/' + options;
sendRequestCallback(callback, op);
},
//Private API
getbalances: function(callback) {
var op = setRequestUri('GetBalance', {});
//console.log('url =', op);
sendRequestCallbackPrivate(callback, op);
},
getbalance: function(options, callback) {
var op = setRequestUri('GetBalance', options);
sendRequestCallbackPrivate(callback, op);
},
getdepositaddress: function(options, callback) {
var op = setRequestUri('GetDepositAddress', options);
sendRequestCallbackPrivate(callback, op);
},
getopenorders: function(options, callback) {
var op = setRequestUri('GetOpenOrders', options);
sendRequestCallbackPrivate(callback, op);
},
gettradehistory: function(options, callback) {
var op = setRequestUri('GetTradeHistory', options);
sendRequestCallbackPrivate(callback, op);
},
gettransactions: function(options, callback) {
var op = setRequestUri('GetTransactions', options);
sendRequestCallbackPrivate(callback, op);
},
submittrade: function(options, callback) {
var op = setRequestUri('SubmitTrade', options);
sendRequestCallbackPrivate(callback, op);
},
canceltrade: function(options, callback) {
var op = setRequestUri('CancelTrade', options);
sendRequestCallbackPrivate(callback, op);
},
submittip: function(options, callback) {
var op = setRequestUri('SubmitTip', options);
sendRequestCallbackPrivate(callback, op);
},
submitwithdraw: function(options, callback) {
var op = setRequestUri('SubmitWithdraw', options);
sendRequestCallbackPrivate(callback, op);
},
submittransfer: function(options, callback) {
var op = setRequestUri('SubmitTransfer', options);
sendRequestCallbackPrivate(callback, op);
},
};
}();
module.exports = NodeCryptopia;