UNPKG

node.cryptopia

Version:

Node Cryptopia API - asynchronous node.js library for the Cryptopia API

205 lines (183 loc) 7.76 kB
/* ============================================================ * 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;