binance-api-node-wrapper
Version:
wrapper for binance api
99 lines (98 loc) • 3.77 kB
JavaScript
import BinanceFutures from "./BinanceFutures.js";
import { EventEmitter } from 'events';
class BinanceUserData extends BinanceFutures {
constructor(apiKey, apiSecret) {
super(apiKey, apiSecret);
this.userData = {
positions: [],
orders: []
};
this.emitPosition = (symbol) => {
BinanceUserData.Emitter.emit(BinanceUserData.POSITION_EVENT, symbol, this.userData.positions.find(p => p.symbol === symbol));
};
this.emitOrders = (symbol) => {
BinanceUserData.Emitter.emit(BinanceUserData.ORDER_EVENT, symbol, this.userData.orders.filter(order => order.symbol === symbol));
};
this.handleUserData = (data) => {
switch (data.event) {
case "ACCOUNT_UPDATE":
data.accountData.positions.forEach(this.setPosition);
break;
case "ORDER_TRADE_UPDATE":
this.setOrders(data.orderData);
break;
default:
// console.log(`No event found: `, data)
break;
}
// console.log(userData);
};
this.setOrders = async (data) => {
const symbol = data.symbol;
// console.log(data);
if (data.orderType === "MARKET")
return;
switch (data.orderStatus) {
case "CANCELED":
case "FILLED":
case "REJECTED":
case "EXPIRED":
this.userData.orders = this.userData.orders.filter(order => order.clientOrderId !== data.clientOrderId);
break;
case "NEW":
this.userData.orders.push(data);
break;
default:
return;
}
//Emit event to listeners
this.emitOrders(symbol);
};
this.setPosition = async (data) => {
const symbol = data.symbol;
const position = this.userData.positions.find(p => p.symbol === symbol);
if (typeof position === 'undefined') {
this.userData.positions.push(data);
}
else {
this.userData.positions = this.userData.positions.map(p => {
if (p.symbol === symbol) {
return data;
}
return p;
});
}
//Emit event to listeners
this.emitPosition(symbol);
};
}
init() {
BinanceUserData.Emitter.on(BinanceUserData.TRIGGER_POSITION_EVENT, this.emitPosition);
BinanceUserData.Emitter.on(BinanceUserData.TRIGGER_ORDER_EVENT, this.emitOrders);
return Promise.all([
this.futuresUserDataStream(this.handleUserData),
this.requestAllOrders(),
this.requestAllPositions()
]);
}
async requestAllOrders() {
const request = await this.getOpenOrders();
if (!request.success) {
throw new Error(`getOpenOrders() - ${request.errors}`);
}
this.userData.orders = request.data;
}
async requestAllPositions() {
const request = await this.getOpenPositions();
if (!request.success) {
throw new Error(`getOpenPositions() - ${request.errors}`);
}
this.userData.positions = request.data;
}
}
BinanceUserData.Emitter = new EventEmitter();
BinanceUserData.POSITION_EVENT = 'position';
BinanceUserData.ORDER_EVENT = 'order';
BinanceUserData.TRIGGER_POSITION_EVENT = 'triggerPosition';
BinanceUserData.TRIGGER_ORDER_EVENT = 'triggerOrder';
export default BinanceUserData;