@gazsiazasz/binance-api
Version:
Binance API (REST + WebSocket) for Node.js
133 lines (117 loc) • 3.33 kB
JavaScript
const crypto = require('crypto')
const axios = require('axios')
const { setupCache } = require('axios-cache-adapter')
const proxyWrapper = require('./modules/proxy')
// Create `axios-cache-adapter` instance
const cache = setupCache({
maxAge: 60 * 60 * 1000, // 60 min
exclude: { query: false }
})
// Create `axios` instance passing the newly created `cache.adapter`
const axiosWithCache = axios.create({
adapter: cache.adapter
})
const renameKeys = require('../renameKeys')
const { restSchema } = require("./modules/schema")
/**
* https://github.com/binance-exchange/binance-official-api-docs/blob/master/rest-api.md
* Example: api.rest.time().then(data => console.log(data))
* Example: api.rest.depth({symbol: 'ETHBTC', limit: 100}).then(data => console.log(data))
*/
const url = 'https://api.binance.com/api/'
const schema = {
test: {
url: 'v3/ping',
},
exchangeInfo: {
url: 'v3/exchangeInfo',
},
time: {
url: 'v3/time',
},
depth: {
url: 'v3/depth',
},
klines: {
url: 'v3/klines',
},
trades: {
url: 'v3/trades',
},
avgPrice: {
url: 'v3/avgPrice'
},
aggTrades: {
url: 'v3/aggTrades'
},
ticker24hr: {
url: 'v3/ticker/24hr',
},
ticker: {
url: 'v3/ticker/price',
},
account: {
url: 'v3/account',
method: 'get',
private: true
},
openOrders: {
url: 'v3/openOrders',
method: 'get',
private: true
},
allOrders: {
url: 'v3/allOrders',
method: 'get',
private: true
},
createOrder: {
url: 'v3/order',
method: 'post',
private: true,
},
deleteOrder: {
url: 'v3/order',
method: 'delete',
private: true
},
myTrades: {
url: 'v3/myTrades',
method: 'get',
private: true
},
createTestOrder: {
url: 'v3/order/test',
method: 'post',
private: true,
params: {
timeInForce: 'GTC',
type: 'LIMIT'
}
},
}
const rename = (data, event) => renameKeys(restSchema[event], data)
const requestPrivateAPI = ({ params: defaultParams = {}, ...data }, { auth = {}, params = {}, proxy }, event) => {
const timestamp = Date.now()
const queryString = new URLSearchParams(Object.assign(params, defaultParams, { timestamp })).toString()
const signature = crypto.createHmac('sha256', auth.secret)
.update(queryString)
.digest('hex')
const options = {
method: data.method,
url: proxyWrapper(url, data.url, proxy),
headers: { 'X-MBX-APIKEY': auth.key },
params: Object.assign(params, data.params, { signature }, { timestamp }),
}
return axiosWithCache(options).then(res => rename(res.data, event))
}
const requestPublicAPI = (data, { proxy, ...params }, event) => {
return axiosWithCache.get(proxyWrapper(url, data.url, proxy), { params }).then(res => rename(res.data, event))
}
const api = Object.keys(schema).reduce((result, item) => {
result[item] = (payload) => (schema[item].private) ? requestPrivateAPI(schema[item], payload, item) : requestPublicAPI(schema[item], payload, item)
return result
}, {})
module.exports = {
...api
}